当前位置: 首页 > news >正文

AtCoder AT_abc413_c [ABC413C] Large Queue 题解

题目大意

有一个初始为空的序列 A A A Q Q Q 次操作分为两类:

  • 第一类:将 c c c x x x 放到 A A A 的末尾。
  • 第二类:将前 k k k 个数的和输出并移除它们。

思路

这是一个求和问题,想到的第一个思路是前缀和。但是前缀和的维护需要使用树状数组,不仅麻烦还费时间、空间,在一道 300pts \texttt{300pts} 300pts 的 C 题中显然不现实。

既然不能完美地算出这个和,我们考虑一个稍微暴力的做法。如果我们直接按照题意去维护序列,空间会炸掉(因为 c c c 最大是 1 0 9 10^9 109),于是想到只记下每一个“块”。在这里,我们定义“块”为在每次第一类操作中添加的 c c c x x x 组成的子段。因为最多有 Q Q Q 次操作,所以空间是没问题的。我们使用一个滑动窗口去维护, l l l 表示目前没有被删除的块中编号最小的一个的编号, r r r 表示目前存在的块中编号最大的一个的编号, v a l i val_i vali 表示编号为 i i i 的块的值, n u m i num_i numi 表示编号为 i i i 的块还有多少个数没被删除。

于是,对于第一类操作,我们可以直接 O ( 1 ) O(1) O(1) 添加:

x 和 c 为输入的值
val[++r] = x;
num[r] = c;

对于第二类操作,我们就需要花费一些时间去查找了,从 l l l 开始依次遍历每一个块 i i i,删掉 min ⁡ ( n u m i , k 剩余 ) \min(num_i,k_{剩余}) min(numi,k剩余) 个数,直到 k 剩余 k_{剩余} k剩余 为零,在删的过程中顺便求和:

while (k > 0)
{答案 += min(num[l], k) * val[l]if (能完整的删完这一个块)k -= num[l], l++else num[l] -= k
}

代码

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;int q, l = 1, r; // l 的初始值为 1 不要忘记
int val[200010];
int num[200010];int main()
{cin >> q;while (q--){int op;cin >> op;if (op == 1){int c, x;cin >> c >> x;val[++r] = x;num[r] = c;}else{int k;cin >> k;long long ans = 0; // 不要忘记开 long longwhile (k > 0){ans += 1LL * min(num[l], k) * val[l];if (k >= num[l]) k -= num[l], l++;else num[l] -= k, k = 0;}cout << ans << endl;}}return 0;
}

总结

时间复杂度……不太会算,通过本题是没有问题的。如果您能计算这份代码的时间复杂度,欢迎在评论区中提出!

http://www.lryc.cn/news/580323.html

相关文章:

  • Oracle 数据库——企业级核心系统
  • MySQL(118)如何使用SSL进行加密连接?
  • mysql的备份与恢复(使用mysqldump)
  • pyinstaller打包教程
  • TCP数据的发送和接收
  • 闲庭信步使用SV搭建图像测试平台:第三十一课——基于神经网络的手写数字识别
  • Ubuntu基础(监控重启和查找程序)
  • 模块三:现代C++工程实践(4篇)第一篇《C++模块化开发:从Header-only到CMake模块化》
  • Redis的编译安装
  • LabVIEW电阻率测试
  • LinkedList剖析
  • Kafka消息积压全面解决方案:从应急处理到系统优化
  • idea的使用小技巧,个人向
  • 类图+案例+代码详解:软件设计模式----适配器模式
  • 【电赛培训】运算放大器、滤波器
  • 使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
  • 堆的简单介绍
  • 智链万物:人工智能驱动的产业智能化革命
  • 使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
  • Python(28)Python循环语句指南:从语法糖到CPython字节码的底层探秘
  • 解决el-select数据类型相同但是显示数字的问题
  • 【Project】基于kafka的高可用分布式日志监控与告警系统
  • C#扩展方法全解析:给现有类型插上翅膀的魔法
  • CMake基础:条件判断详解
  • 探索 Ubuntu 上 MongoDB 的安装过程
  • [Cyclone] 哈希算法 | SIMD优化哈希计算 | 大数运算 (Int类)
  • 【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的关系是什么?
  • 若 VSCode 添加到文件夹内右键菜单中显示
  • 03_性能优化:让软件呼吸更顺畅
  • ABB焊接机器人智能节气仪