AcWing 128 编辑器(对顶栈)
解题思路
对顶栈的模板题。L和R的操作可以由对顶栈来实现,至于查询操作用一个前缀和数组和一个存最大值的数组来存就行了。
代码
const int maxn = 1e6+10;
stack<int> skl, skr;
int pre[maxn], f[maxn] = {-114514}, k;
int main() {
int q; scanf("%d",&q);
while(q--) {
char ch[2]; int num; scanf("%s",ch);
if (ch[0]=='I') {
scanf("%d",&num);
++k;
pre[k] = pre[k-1]+num;
f[k] = max(f[k-1],pre[k]);
skl.push(num);
}
else if (ch[0]=='D') {
if (!skl.empty()) {
--k; skl.pop();
}
}
else if (ch[0]=='L') {
if (!skl.empty()) {
--k;
skr.push(skl.top());
skl.pop();
}
}
else if (ch[0]=='R') {
if (!skr.empty()) {
++k;
pre[k] = pre[k-1]+skr.top();
f[k] = max(f[k-1],pre[k]);
skl.push(skr.top());
skr.pop();
}
}
else if (ch[0]=='Q') {
scanf("%d",&num);
printf("%d\n",f[num]);
}
}
return 0;
}