首先我们理解光标的位置在数与数之间,我们有stack s1,s2, s1是用来存第一个数到光标的位置之间的元素,s2是用来存后面的数,当然 s1,s2的top都是离光标的位置比较近的;
当操作I时,s1push就行了,在维护一下s1里面元素个数的前缀和sum[s1.size()]=sum[s1.size()-1]+y;当s1进入元素时前面的前缀和是不变的;当再次到这个位置可以重新利用,还要维护s1.size()这个位置之前的前缀和最大值,ans[s1.size()]=max(ans[s1.size()-1],sum[s1.size()]);这个状态的最大值是固定的不会因为s1在加入元素会改变,会改变只有再次有当前状态的元素个数时;
当操作D,s1pop就行;
当为Q是输出ans【k】就行;
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<cstring> #include<bitset> #include<map> #include<stack> using namespace std; #define ll long long typedef pair<int,int>P; const int len=1e6+4; int sum[len],ans[len]; char str[10]; stack<int>s1,s2; int main() { int n; while(cin>>n) { while(s1.size())s1.pop(); while(s2.size())s2.pop(); int x,y; getchar(); sum[0]=0; ans[0]=-0x3f3f3f3f; for(int i=1;i<=n;++i) { scanf("%s",str); if(str[0]=='I') { scanf("%d",&y); s1.push(y); sum[s1.size()]=sum[s1.size()-1]+y; ans[s1.size()]=max(ans[s1.size()-1],sum[s1.size()]); } else if(str[0]=='D')s1.pop(); else if(str[0]=='L') { if(s1.size()) { y=s1.top(); s1.pop(); s2.push(y); } } else if(str[0]=='R') { if(s2.size()) { y=s2.top(); s2.pop(); s1.push(y); sum[s1.size()]=sum[s1.size()-1]+y; ans[s1.size()]=max(ans[s1.size()-1],sum[s1.size()]); } } else if(str[0]=='Q') { scanf("%d",&y); printf("%d\n",ans[y]); } } } }