进阶指南中给了一个好玩的方法,对顶栈,与对顶堆有这异曲同工之妙,涉及左侧栈的操作,都需要对保存最大前缀和的数组进行维护
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
stack<int>a,b;
long long sum[1000005];
int main(){
int n;
cin>>n;
while(n--){
char c;
cin>>c;
int x;
if(c=='I'){
cin>>x;
a.push(x);
sum[a.size()]=sum[a.size()-1]+x;
}
if(c=='Q'){
cin>>x;
long long maxans=-0x3f3f3f;
for(int i=1;i<=x;i++) maxans=max(sum[i],maxans);
cout<<maxans<<"\n";
}
if(c=='D'){
a.pop();
}
if(c=='L'){
x=a.top();
a.pop();
b.push(x);
}
if(c=='R'){
x=b.top();
b.pop();
a.push(x);
sum[a.size()]=sum[a.size()-1]+x;
}
}
return 0;
}