#P11325. 【MX-S7-T3】「SMOI-R2」Monotonic Queue
【MX-S7-T3】「SMOI-R2」Monotonic Queue
题目背景
原题链接:https://oier.team/problems/S7C。
题目描述
给定一个正整数 和 个整数 (这些数可能为负),以及一个 的排列 。
为了考验朋友小 L 的能力,你设计了一道这样一道题目:
给定 个区间 ,它们满足以下条件:
- ;
- ;
- 。
对于每个区间 ,小 L 需要求出 中最大值的位置,记为 。
小 L 准备使用单调队列来高效地完成这个题目。他的算法核心伪代码如下:
对应的 C++ 实现代码如下:
deque<int> Q;
l[0] = r[0] = sum = 0;
for (int i = 1; i <= n; i++) {
for (int j = r[i - 1] + 1; j <= r[i]; j++) {
while (!Q.empty() && a[Q.back()] < a[j]) {
sum = sum + c[Q.back()];
Q.pop_back();
}
Q.push_back(j);
}
while (Q.front() < l[i]) Q.pop_front();
b[i] = Q.front();
}
你发现小 L 一遍就通过了这道题目,但是你突然对 sum
的值非常感兴趣。现在你想知道,在所有满足条件的 个区间的组合中,算法结束后 sum
的最大值是多少。
输入格式
第一行,一个正整数 。
第二行, 个整数 。
第三行, 个正整数 ,保证 为 的排列。
输出格式
仅一行,一个整数,表示答案。
5
-190 133 210 155 -442
1 3 2 4 5
308
10
-205 -268 -487 -112 -82 -330 153 133 -219 -157
5 6 7 9 2 1 4 10 3 8
0
5
-288 479 205 -310 -66
1 3 2 4 5
396
提示
【样例解释 #1】
若所有区间都为 ,则算法结束后 sum
的值为 。可以证明没有使 sum
更大的方案。
【样例解释 #2】
若所有区间都为 ,则算法结束后 sum
的值为 。可以证明没有使 sum
更大的方案。
【样例解释 #3】
若 个区间分别为 、、、、,则算法结束后 sum
的值为 。可以证明没有使 sum
更大的方案。
【样例 #4】
见附件中的 queue/queue4.in
与 queue/queue4.ans
。
该组样例满足测试点 的约束条件。
【样例 #5】
见附件中的 queue/queue5.in
与 queue/queue5.ans
。
该组样例满足测试点 的约束条件。
【样例 #6】
见附件中的 queue/queue6.in
与 queue/queue6.ans
。
该组样例满足测试点 的约束条件。
【数据范围】
对于所有测试数据,保证:,,, 为 的排列。
测试点编号 | 特殊性质 | |
---|---|---|
无 | ||
A | ||
无 | ||
B | ||
C | ||
无 | ||
- 特殊性质 A:满足 的 不超过 个。
- 特殊性质 B:满足 的 不超过 个。
- 特殊性质 C:满足 的 不超过 个。