题目
样例输入:
8
I 2
I -1
I 1
Q 3
L
D
R
Q 2
样例输出:
2
3
样例解释:
数据范围:
剖解题目
。。。。。。
思路
一脸懵逼的望着,还在想怎么用线段树搞插入之类的。。。。。
然而竟然只是个链表。。。。
解法
对于15%:segement tree||BIT可以解决。
对于后面的75%:暴力即可。
100%:链表处理,维护每个点的前驱和后驱,搞一搞就可以了。
代码
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1e6+5;
int le[maxn],ri[maxn],num,n,lg,a[maxn],sum[maxn],mx[maxn],pos[maxn];
bool bz[maxn];
int main()
{
//freopen("T2.in","r",stdin);
//freopen("T.out","w",stdout);
scanf("%d",&n);
mx[0]=-1e9;
ri[0]=n+1;
fo(i,1,n){
char ch;
scanf("%s",&ch);
if (ch=='I') {
int x;
scanf("%d",&x);
ri[++num]=ri[lg]; le[ri[lg]]=num;
ri[lg]=num; le[num]=lg;
a[num]=x; lg=num;
pos[lg]=pos[le[lg]]+1;
sum[lg]=sum[le[lg]]+a[lg];
mx[pos[lg]]=max(mx[pos[le[lg]]],sum[lg]);
}
else if (ch=='D'){
int hg=lg;
lg=le[lg];
ri[le[hg]]=ri[hg];
le[ri[hg]]=le[hg];
pos[ri[lg]]=pos[lg]+1;
}
else if (ch=='L') lg=le[lg];
else if (ch=='R') {
if (ri[lg]!=n+1) {
lg=ri[lg];
pos[lg]=pos[le[lg]]+1;
sum[lg]=sum[le[lg]]+a[lg];
mx[pos[lg]]=max(mx[pos[le[lg]]],sum[lg]);
}
}
else {
int x;
scanf("%d",&x);
printf("%d\n",mx[x]);
}
}
}