【HDOJ4699】Editor(对顶栈,模拟)

problem
  • 维护一个整数序列的编辑器,支持5种操作,操作数< 1e6
  • I x:在光标后插入数x,插入后光标移到x后
  • D:删除光标前的一个整数
  • L:光标左移一个位置
  • R:光标右移一个位置
  • Q k:询问k之前的最大前缀和,k不超过光标位置
solution
  • 特殊性:I,D,L,R都在光标位置修改。所以想到对顶栈。
  • 再开一个数组f维护栈A的前缀和的最大值即可。
codes
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn = 1e6+10;
int f[maxn];
int main(){
    int T;
    while(scanf("%d",&T)!=EOF){
        stack<int>A,B;
        int sum = 0;//到光标为止的前缀和
        f[0]=-999999999;
        while(T--){
            char op[20];
            scanf("%s",op);
            if(op[0]=='I'){
                int x; scanf("%d",&x);
                A.push(x);
                sum += x;
                int cur = A.size();
                f[cur] = max(sum, f[cur-1]);
            }else if(op[0]=='D'){
                if(A.size()>=1){
                    sum -= A.top();
                    A.pop();
                }
            }else if(op[0]=='L'){
                if(A.size()>=1){
                    sum -= A.top();
                    B.push(A.top());
                    A.pop();
                }
            }else if(op[0]=='R'){
                if(B.size()>=1){
                    A.push(B.top());
                    sum += B.top();
                    int cur = A.size();
                    f[cur] = max(sum,f[cur-1]);
                    B.pop();
                }
            }else if(op[0]=='Q'){
                int k; scanf("%d",&k);
                printf("%d\n",f[k]);
            }
        }
    }
   return 0;
}

转载于:https://www.cnblogs.com/gwj1314/p/9444600.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值