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

problem

Description

JZOJsenior4778.【NOIP2016提高A组模拟9.14】数列编辑器_第1张图片

Input

Output

Sample Input

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

Sample Output

2
3
样例解释:

JZOJsenior4778.【NOIP2016提高A组模拟9.14】数列编辑器_第2张图片

Data Constraint

JZOJsenior4778.【NOIP2016提高A组模拟9.14】数列编辑器_第3张图片


analysis

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

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

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

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

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


code

#include
#include
#include
#define MAXN 1000001

using 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;   
} 

你可能感兴趣的:(模拟赛,栈)