版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37867156/article/details/82080599
题目描述:维护一个整数序列的编辑器,有以下五种操作:
I x: 光标前插入x这个数,插入以后光标移动到 x 之后
D: 删除光标前的数
L: 光标左移一位 若已到最左边移不动,就不移
R: 光标右移一位 若移不动,就不移了
Q k: 输出在位置 k 之前的最大前缀和。
分析:建立两个栈,栈 A 存储当前光标位置之前的序列,栈B存储当前位置到序列结尾的序列。用一个数组 f 维护栈 A 的最大前缀和, sum 表示栈A的前缀和数组。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int maxn=1000005;
int sum[maxn],f[maxn];
int a[maxn],b[maxn];
void init(){//初始化
memset(sum,0,sizeof sum);
memset(f,0,sizeof f);
memset(a,0,sizeof a);
memset(b,0,sizeof b);
f[0]=-INF;//x可以为负数、故此处初始化最大前缀和为负无穷,不然就wa了
}
int main(){
char cd;
int k,q,x;
while(~scanf("%d",&q)){
init();
int i=0,j=0;
while(q--){
getchar();
scanf("%c",&cd);
if(cd=='I'){
scanf("%d",&x);
a[++i]=x;
sum[i]=sum[i-1]+a[i];
f[i]=max(f[i-1],sum[i]);
}else if(cd=='D'){
i--;
}else if(cd=='L'){
if(i!=0)
b[++j]=a[i--];
}else if(cd=='R'){
if(j!=0){
a[++i]=b[j--];
sum[i]=sum[i-1]+a[i];
f[i]=max(f[i-1],sum[i]);
}
}else if(cd=='Q'){
scanf("%d",&k);
printf("%d\n",f[k]);
}
}
}
return 0;
}