P2201 数列编辑器(双栈)
题目描述
小 Z 是一个爱好数学的小学生。最近,他在研究一些关于整数数列的性质。
为了方便他的研究,小Z希望实现一个叫做“Open Continuous Lines Processor”的数列编辑器。
一开始,数列编辑器里没有数字,只有一个光标。这个数列编辑器需要支持五种操作。
$I x$在当前光标前插入数字 $x$。$D$删除当前光标前的数字。$L$光标向前移动一个数字。$R$光标向后移动一个数字。$Q k$设光标之前的数列是 ${a1,a2,⋯,an}$,输出第$k$位及之前最大的前缀和,保证 $k⩽n$。
输入格式
第一行包含一个数字 $N$,表示操作的个数。
接下来包含$N$行,每行包含一条命令。
输出格式
对于每个$Q k$命令,输出一个整数表示这个操作的答案。
题解
维护两个栈,一个栈维护光标左边的数,一个栈维护光标右边的数,对于维护左边的栈我们记录一个前缀和就可以轻易的算出左边前k个数的和并维护出最大值。
Code
#include<iostream> #include<algorithm> using namespace std; const int maxn=1e6+100; char s[1000]; int ans[maxn],sum[maxn]; int s1[maxn],s2[maxn]; int top1,top2; int p; int main(){ int n; cin>>n; ans[0]=-1e9; while(n--){ scanf("%s",s); if(s[0]=='I'){ scanf("%d",&p); s1[++top1]=p; sum[top1]=sum[top1-1]+p; ans[top1]=max(ans[top1-1],sum[top1]); } else if(s[0]=='D'){ top1--; } else if(s[0]=='L'){ s2[++top2]=s1[top1--]; } else if(s[0]=='R'){ int x=s2[top2--]; s1[++top1]=x; sum[top1]=sum[top1-1]+x; ans[top1]=max(ans[top1-1],sum[top1]); } else if(s[0]=='Q'){ scanf("%d",&p); printf("%d\n",ans[p]); } } } /* 8 I 2 I -1 I 1 Q 3 L D R Q 2 */

浙公网安备 33010602011771号