【二分查找 树状树状】P9588 「MXOI Round 2」队列|普及+
本文涉及的基础知识点
C++二分查找
树状数组
「MXOI Round 2」队列
题目描述
小 C 有一个队列,他要对这个队列进行 qqq 次操作。操作共四种,参数分别如下:
1x1\ x1 x:这是第一种操作,表示从队尾依次插入 1,2,3,⋯,x1,2,3,\cdots,x1,2,3,⋯,x;
2y2\ y2 y:这是第二种操作,表示弹出队头的前 yyy 个元素;
3z3\ z3 z:这是第三种操作,表示查询队列中的第 zzz 个元素;
444:这是第四种操作,表示查询队列中所有元素的最大值。
你需要帮助他维护这个队列,并对于每个第三种操作和第四种操作,输出查询的答案。
输入格式
第一行两个整数 c,qc,qc,q,其中 ccc 表示测试点编号。c=0c=0c=0 表示该测试点为样例。
接下来 qqq 行,每行 1∼21 \sim 21∼2 个整数,表示一个操作,格式见【题目描述】。
输出格式
对于每个第三种操作和第四种操作,输出一行一个整数,表示查询的答案。
样例 #1
样例输入 #1
0 9
1 5
1 3
2 2
1 4
3 6
3 8
2 4
4
3 3
样例输出 #1
3
2
4
1
提示
【样例解释 #1】
在进行第四次操作后,队列中的元素依次为 3,4,5,1,2,3,1,2,3,43,4,5,1,2,3,1,2,3,43,4,5,1,2,3,1,2,3,4。
在进行第七次操作后,队列中的元素依次为 2,3,1,2,3,42,3,1,2,3,42,3,1,2,3,4。
【样例 #2】
见附加文件中的 queue/queue2.in
与 queue/queue2.ans
。
该样例满足测试点 111 的限制。
【样例 #3】
见附加文件中的 queue/queue3.in
与 queue/queue3.ans
。
该样例满足测试点 444 的限制。
【样例 #4】
见附加文件中的 queue/queue4.in
与 queue/queue4.ans
。
该样例满足测试点 111111 的限制。
【样例 #5】
见附加文件中的 queue/queue5.in
与 queue/queue5.ans
。
该样例满足测试点 151515 的限制。
【样例 #6】
见附加文件中的 queue/queue6.in
与 queue/queue6.ans
。
该样例满足测试点 202020 的限制。
【数据范围】
设 ∑x\sum x∑x 表示单个测试点内 xxx 之和。
对于 100%100\%100% 的数据,1≤q≤2×1051 \le q \le 2\times 10^51≤q≤2×105,1≤x,y,z≤1091 \le x,y,z \le 10^91≤x,y,z≤109,0≤∑x≤2×10140 \le \sum x \le 2\times10^{14}0≤∑x≤2×1014,保证在进行第二种操作前队列内元素个数不小于 yyy,在进行第三种操作前队列内元素个数不小于 zzz,在进行第四种操作前队列内元素个数大于 000。
测试点编号 | q≤q \leq≤ | x≤x \lex≤ | ∑x≤\sum x \le∑x≤ | 特殊性质 |
---|---|---|---|---|
1∼31\sim31∼3 | 500500500 | 500500500 | 2×1052\times10^52×105 | C |
4∼84\sim84∼8 | 500050005000 | 500050005000 | 2×1072\times10^72×107 | 无 |
9∼109\sim109∼10 | 2×1052\times10^52×105 | 10910^9109 | 2×10142\times10^{14}2×1014 | AB |
11∼1211\sim1211∼12 | 2×1052\times10^52×105 | 10910^9109 | 2×10142\times10^{14}2×1014 | B |
13∼1413\sim1413∼14 | 2×1052\times10^52×105 | 10910^9109 | 2×1092\times10^92×109 | AC |
15∼1615\sim1615∼16 | 2×1052\times10^52×105 | 10910^9109 | 2×1092\times10^92×109 | C |
17∼1817\sim1817∼18 | 2×1052\times10^52×105 | 500500500 | 2×1072\times10^72×107 | 无 |
191919 | 2×1052\times10^52×105 | 10910^9109 | 2×1092\times10^92×109 | 无 |
202020 | 2×1052\times10^52×105 | 10910^9109 | 2×10142\times10^{14}2×1014 | 无 |
特殊性质 A:没有第二种操作。
特殊性质 B:没有第三种操作。
特殊性质 C:没有第四种操作。
二分查找 树状数组
用向量模拟队列,vque[i] 记录 第 i个操作一的x。
cur表示vque[0…cur-1]已经全部出队,vque[cur]没有全部出队。
curerase记录 vque[cur]已经删多少元素。
多键有序集合sx记录,que中的x。
树状数组treeArr[i]记录vque[i]原始数量。
long long has 记录已经出队的元素数量。
二分查找:寻找首端
检测函数:treeArr.Sum(mid) -has >= z
单元测试
vector<pair<int, int>> a;TEST_METHOD(TestMethod11){a = { {1,5},{1,3},{2,2},{1,4},{3,6},{3,8},{2,4},{4,-1},{3,3} };auto res = Solution().Ans(a);AssertEx({ 3,2,4,1 }, res);}
扩展阅读
我想对大家说的话 |
---|
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。 |
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作 |
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注 |
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。 |
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。 |
如果程序是一条龙,那算法就是他的是睛 |
失败+反思=成功 成功+反思=成功 |
视频课程
先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176
测试环境
操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。