题记
讲真这道题..最开始看到的时候..它属于平衡树分类…然后吧..我就认真的看了..认真的想了..认真的做了..然后就..认真的t了
后来…测了网上的平衡树..都t了(再见再见)
以至于..平衡树给我留下了深刻的阴影..直接放弃做了(再见再见)
题意
五个操作:I:在光标后加入一个数
D:删除光标前那个数
R:光标右移(移到尾就不移了)
L:光标左移(移到头就不移了)
Q:查询前k个前缀和最大的是多少
题解
用两个栈来维护,第一个表示光标前的数,第二个表示光标后的数
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 1000010
char ch[5];
int n,l,r,a[N],b[N],A[N],B[N],s[N];
int main(){
while(scanf("%d",&n)>0){
l=r=0;
for(int i=1;i<=n;i++){
scanf("%s",ch);
if(ch[0]=='I'){
int x;scanf("%d",&x);
A[++l]=x;
if(l==1) s[l]=a[l]=x;
else a[l]=a[l-1]+x,s[l]=max(a[l],s[l-1]);
}else if(ch[0]=='D'){
if(l>0) l--;
}else if(ch[0]=='L'){
if(l>0) B[++r]=A[l--];
}else if(ch[0]=='R'){
if(r>0){
A[++l]=B[r--];
if(l==1) s[l]=a[l]=A[l];
else a[l]=a[l-1]+A[l],s[l]=max(a[l],s[l-1]);
}
}else{
int x;scanf("%d",&x);
printf("%d\n",s[x]);
}
}
}
return 0;
}