小蓝p50
对顶栈/堆用于在序列中间某个指定位置进行修改
#include <iostream>
#include <stack>
#include<algorithm>
#include <cstring>
using namespace std;
const int f=-0x3f3f3f3f;
stack<int> s1,s2;
int dp[100000];//dp是最大前缀和
int sum[100000];//sum是前缀和
//用前缀和去维护最大前缀和(dp)
int pos=0;//这是光标所在的位置
int main() {
int t;
cin>>t;
memset(dp, f, sizeof(dp));
memset(sum, 0, sizeof(sum));
while(t--) {
char c;
cin >> c;
if (c == 'I') {
int a;
cin >> a;
s1.push(a);
pos++;//这步必须在这里,要不sum溢出
sum[pos]=sum[pos-1]+a;
dp[pos]=max(dp[pos-1],sum[pos]);
// cout<<"sum["<<pos<<"] "<<sum[pos]<<endl;
// cout<<"dp[pos] "<<dp[pos];
}
else if(c=='D'){
if(s1.empty())continue;//注意
s1.pop();
pos--;
}
else if(c=='L'){
if(s1.empty())continue;//注意
int q=s1.top();
s1.pop();
s2.push(q);
pos--;
}
else if(c=='R'){
if(s2.empty())continue;//注意
int q=s2.top();
s2.pop();
s1.push(q);
pos++;
sum[pos]=sum[pos-1]+q;
dp[pos]=max(dp[pos-1],sum[pos]);
}
else{
int r;
cin>>r;
cout<<dp[r]<<endl;
}
}
}