用前后两个栈保存,前栈的栈顶储存光标位置,随着插入元素和光标右移时维护一个sum数组储存前几个数的和,再维护一个数组储存前几个数的和的最大值,访问是直接查询就行。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
stack<int> a,b;
int sum[100010],f[100010];
int main(){
int n,t;
char c;
scanf("%d",&n);
f[0]=-1e9;
while(n--){
cin>>c;
if(c=='I'){
scanf("%d",&t);
a.push(t);
sum[a.size()]=sum[a.size()-1]+a.top();
f[a.size()]=max(f[a.size()-1],sum[a.size()]);
}
else if(c=='D'){
if(!a.empty())
a.pop();
}
else if(c=='R'){
if(!b.empty()){
a.push(b.top());
b.pop();
sum[a.size()]=sum[a.size()-1]+a.top();
f[a.size()]=max(f[a.size()-1],sum[a.size()]);
}
}
else if(c=='L'){
if(!a.empty()){
b.push(a.top());
a.pop();
}
}
else if(c=='Q'){
scanf("%d",&t);
printf("%d\n",f[t]);
}
}
return 0;
}