题目
你正在设计一种新型的编辑器,这种编辑器可以高效地处理整数序列。
编辑器启动时,序列为空,光标指向序列的头部。编辑器支持下列 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。
分析
考试时sb了,没有想出来
我们可以开两个栈,一个指针前的序列,一个指针后的序列.
若是L,R操作,把栈顶的弹出来,加入到另一个栈里维护。
维护一个前缀和,每次操作都要更新。
code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
#include<stack>
#define maxn 2000100+10
#define INF 0x7fffffff;
using namespace std;
stack<int> L;
stack<int> R;
int sum[maxn];
int Sum;
int head,tail;
int n;
int add(int x)
{
L.push(x);
Sum+=x;
int top=L.size();
sum[top]=max(sum[top-1],Sum);
}
int del(int &x)
{
if (L.empty()) return 0;
x=L.top();
L.pop();
Sum-=x;
return 1;
}
char c[10];
int main()
{
scanf("%d",&n);
sum[0]=-INF;
for (int i=1;i<=n;i++)
{
int x;
scanf("%s",c);
if (c[0]=='I')
{
scanf("%d",&x);
add(x);
continue;
}
if (c[0]=='D')
{
del(x);
continue;
}
if (c[0]=='L')
{
if (del(x)) R.push(x);
continue;
}
if (c[0]=='R')
{
if (R.empty()) continue;
x=R.top();
R.pop();
add(x);
continue;
}
if (c[0]=='Q')
{
scanf("%d",&x);
printf("%d\n",sum[x]);
}
}
}