数列编辑器 【NOIP2016提高A组模拟9.14】

来源:互联网 发布:小米3淘宝旗舰店 编辑:程序博客网 时间:2024/05/10 10:35

题目

这里写图片描述
样例输入:
这里写图片描述
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]);        }    }}

这里写图片描述

0 0
原创粉丝点击