题意
传送门 HDU 4699 Editor
题解
操作始终在序列中间某个指定位置(即光标)进行修改,参照动态维护中位数的对顶堆算法,使用对顶栈对序列进行维护。
建立 2 2 2 个栈,分别维护序列在光标左边与右边的部分,栈顶对应靠近光标的位置。为了维护某个位置之前的前缀和最大值,使用数组记录光标之前位置的前缀和最小值,当数据入栈时 O ( 1 ) O(1) O(1) 更新即可。
根据对顶栈算法,在 O ( 1 ) O(1) O(1) 时间内实现了各类操作和询问。
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn = 1000005, inf = 0x3f3f3f3f;
int Q, A[maxn], B[maxn], S[maxn], F[maxn];
int main()
{
S[0] = 0, F[0] = -inf;
while (~scanf("%d", &Q))
{
int a = 0, b = 0;
while (Q--)
{
char op;
scanf(" %c", &op);
if (op == 'I')
{
int x;
scanf("%d", &x);
A[++a] = x, S[a] = A[a] + S[a - 1], F[a] = max(S[a], F[a - 1]);
}
else if (op == 'D' && a)
--a;
else if (op == 'L' && a)
B[++b] = A[a--];
else if (op == 'R' && b)
A[++a] = B[b--], S[a] = A[a] + S[a - 1], F[a] = max(S[a], F[a - 1]);
else if (op == 'Q')
{
int k;
scanf("%d", &k);
printf("%d\n", F[k]);
}
}
}
return 0;
}