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

来源:互联网 发布:软件用户手册 由谁来写 编辑:程序博客网 时间:2024/04/30 03:59

problem

Description

Input

Output

Sample Input

8
I 2
I -1
I 1
Q 3
L
D
R
Q 2

Sample Output

2
3
样例解释:

Data Constraint


analysis

考试时确确实实地蒙蔽了一把,woc……

首先,明显地,光标后面的数字对答案没有贡献,所以我们只维护光标前的数字就好了
诶?这不是咩?

我们使用双栈来实现,stack1表示光标前的序列,stack2表示光标后的序列
具体操作

  1. 插入:直接插进stack1
  2. 光标左移:把stack1的栈顶塞到stack2里面
  3. 光标右移:把stack2的栈顶塞到stack1里面
  4. 删除:stack1的栈顶出栈

至于询问,每次执行插进stack1的操作时维护前缀和以及max前缀和即可


code

#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 1000001using namespace std;int stack1[MAXN],stack2[MAXN],ans[MAXN],sum[MAXN];int n,q,top1,top2;int main(){    //freopen("readin.txt","r",stdin);    freopen("editor.in","r",stdin);    freopen("editor.out","w",stdout);    scanf("%d",&q);    char ch=getchar();    memset(ans,128,sizeof(ans));    while (q--)    {        ch=getchar();        if (ch=='L' && top1>0)        {            stack2[++top2]=stack1[top1--];        }        if (ch=='R' && top2>0)        {            stack1[++top1]=stack2[top2--];            sum[top1]=sum[top1-1]+stack1[top1];            ans[top1]=max(sum[top1],ans[top1-1]);        }        if (ch=='I')         {            scanf("%d", &n);            stack1[++top1]=n;            sum[top1]=sum[top1-1]+n;            ans[top1]=max(sum[top1],ans[top1-1]);        }        if (ch=='Q')        {            scanf("%d",&n);            printf("%d\n",ans[n]);        }        if (ch=='D')top1--;        scanf("\n");    }    return 0;   } 
原创粉丝点击