HDU 4699 Editor【对顶栈】

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_37867156/article/details/82080599