牛客 Editor
https://ac.nowcoder.com/acm/contest/1005/A
翻译见liyudong的蓝皮书
分析
对顶栈
维护两个栈,一个记录开始到光标,另一个则记录光标到结束
每个操作均可\(O(1)\)解决
注意:光标不能越出
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n1,n2,s1[N],s2[N],ans[N],s[N];
char st[10];
int main() {
int T; scanf("%d",&T);
n1=n2=0;
while(T--) {
scanf("%s",st);
if(st[0]=='L') {
if(n1) n2++,s2[n2]=s1[n1],n1--;
}
if(st[0]=='R') {
if(n2) {
n1++,s1[n1]=s2[n2],n2--;
s[n1]=s[n1-1]+s1[n1];
if(n1>1) ans[n1]=max(ans[n1-1],s[n1]);
else ans[n1]=s[n1];
}
}
if(st[0]=='I') {
int x; scanf("%d",&x);
s1[++n1]=x;
s[n1]=s[n1-1]+s1[n1];
if(n1>1) ans[n1]=max(ans[n1-1],s[n1]);
else ans[n1]=s[n1];
}
if(st[0]=='D') {
if(n1) n1--;
}
if(st[0]=='Q') {
int x; scanf("%d",&x);
printf("%d\n",ans[x]);
}
}
return 0;
}

浙公网安备 33010602011771号