您的位置:首页 > 其它

JZOJ 3789. 【NOI2015模拟8.20】编辑器

2018-02-03 22:20 387 查看

Description

你正在设计一种新型的编辑器,这种编辑器可以高效地处理整数序列。

编辑器启动时,序列为空,光标指向序列的头部。编辑器支持下列 5 种操作:

1. I x 把整数 x 插入到光标位置;

2. D 删除光标之前的整数(保证光标不在序列的头部);

3. L 如果光标不在序列的头部,向左移动一个位置,否则不移动;

4. R 如果光标不在序列的尾部,向右移动一个位置,否则不移动;

5. Q k 假设光标之前的序列是 {a1, a2, … , an},求 S1, S2, … , Sk 的最大值(其中 Si = a1 +a2 +· · ·+ai )。保证 k ≤ n。

Input

第 1 行,1 个整数 Q,表示操作的数量。

接下来 Q 行,每行描述一个操作。

Output

对于每个操作 Q,输出对应的最大值。

Sample Input

8

I 2

I -1

I 1

Q 3

L

D

R

Q 2

Sample Output

2

3

Data Constraint

• 对于 30% 的数据,Q ≤ 1000;

• 对于 60% 的数据,Q ≤ 10^5;

• 对于 100% 的数据,1 ≤ Q ≤ 10^6, |x| ≤ 1000。

Solution

用两个栈分别维护光标两边的数,如光标右移就将右边的栈顶元素弹出再加入左边的栈顶。

记得判断栈为空则不弹栈(光标到边界了)。

然后维护左边栈的前缀和 和 前缀和的最大值,移光标时修改即可。

这样就可以做到线性复杂度 O(Q) 。

Code

#include<cstdio>
#include<cctype>
using namespace std;
const int N=1e6+5;
int n1,n2,sum;
int a
,b
,ans
;
inline int read()
{
int X=0,w=0; char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
inline void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void change(int x)
{
sum+=a[++n1]=x;
ans[n1]=ans[n1-1]>sum?ans[n1-1]:sum;
}
int main()
{
int q=read();
ans[0]=-1e9;
while(q--)
{
char ch=getchar();
while(ch^'I' && ch^'Q' && ch^'L' && ch^'R' && ch^'D') ch=getchar();
if(ch=='I') change(read()); else
if(ch=='Q') write(ans[read()]),putchar('\n'); else
if(ch=='L')
{
if(n1) sum-=a[n1],b[++n2]=a[n1--];
}else
if(ch=='R')
{
if(n2) change(b[n2--]);
}else sum-=a[n1--];
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: