P2201 数列编辑器(双栈)

题目描述

传送门

小 Z 是一个爱好数学的小学生。最近,他在研究一些关于整数数列的性质。

为了方便他的研究,小Z希望实现一个叫做“Open Continuous Lines Processor”的数列编辑器。

一开始,数列编辑器里没有数字,只有一个光标。这个数列编辑器需要支持五种操作。

  • $I x$在当前光标前插入数字 $x$。
  • $D$ 删除当前光标前的数字。
  • $L$ 光标向前移动一个数字。
  • $R$ 光标向后移动一个数字。
  • $Q k$ 设光标之前的数列是 ${a1​,a2​,⋯,an​}$,输出第$k$位及之前最大的前缀和,保证 $k⩽n$。

输入格式

第一行包含一个数字 $N$,表示操作的个数。

接下来包含$N$行,每行包含一条命令。

输出格式

对于每个$Q k$命令,输出一个整数表示这个操作的答案。

 

题解

维护两个栈,一个栈维护光标左边的数,一个栈维护光标右边的数,对于维护左边的栈我们记录一个前缀和就可以轻易的算出左边前k个数的和并维护出最大值。

Code

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6+100;
char s[1000];
int ans[maxn],sum[maxn];
int s1[maxn],s2[maxn];
int top1,top2;
int p;
int main(){
    int n;
    cin>>n;
    ans[0]=-1e9;
    while(n--){
        scanf("%s",s);
        if(s[0]=='I'){
            scanf("%d",&p);
            s1[++top1]=p;
            sum[top1]=sum[top1-1]+p;
            ans[top1]=max(ans[top1-1],sum[top1]);
        }
        else if(s[0]=='D'){
            top1--;
        }
        else if(s[0]=='L'){
            s2[++top2]=s1[top1--];
        }
        else if(s[0]=='R'){
            int x=s2[top2--];
            s1[++top1]=x;
            sum[top1]=sum[top1-1]+x;
            ans[top1]=max(ans[top1-1],sum[top1]);
        }
        else if(s[0]=='Q'){
            scanf("%d",&p);
            printf("%d\n",ans[p]); 
        }
    } 
}
/*
8
I 2
I -1
I 1
Q 3
L
D
R
Q 2
*/

 

 

posted @ 2021-09-02 19:29  lipu123  阅读(98)  评论(0)    收藏  举报