【NOI2015模拟8.20】编辑器 jzoj 3789 栈+神奇操作

13 篇文章 0 订阅

题目

你正在设计一种新型的编辑器,这种编辑器可以高效地处理整数序列。
编辑器启动时,序列为空,光标指向序列的头部。编辑器支持下列 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]);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值