• 128 编辑器 【双栈】


    编辑器

    问题描述

    你将要实现一个功能强大的整数序列编辑器。

    在开始时,序列是空的。

    编辑器共有五种指令,如下:

    1、“I x”,在光标处插入数值x。
    2、“D”,将光标前面的第一个元素删除,如果前面没有元素,则忽略此操作。
    3、“L”,将光标向左移动,跳过一个元素,如果左边没有元素,则忽略此操作。
    4、“R”,将光标向右移动,跳过一个元素,如果右边没有元素,则忽略次操作。
    5、“Q k”,假设此刻光标之前的序列为a1,a2,…,ana1,a2,…,an,输出max1≤i≤kSimax1≤i≤kSi,其中Si=a1+a2+…+aiSi=a1+a2+…+ai。

    输入格式

    第一行包含一个整数Q,表示指令的总数。

    接下来Q行,每行一个指令,具体指令格式如题目描述。

    输出格式

    每一个“Q k”指令,输出一个整数作为结果,每个结果占一行。

    数据范围

    1≤Q≤106
    |x|≤103
    1≤k≤n

    输入样例:

    8
    I 2
    I -1
    I 1
    Q 3
    L
    D
    R
    Q 2
    

    输出样例:

    2
    3
    

    样例解释

    下图包含了对样例的过程描述:

    C464-1004-2.jpg

    题解

    用两个栈就能模拟过程

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    #define readc(x) scanf("%c",&x)
    #define read(x) scanf("%d",&x)
    #define read2(x,y) scanf("%d%d",&x,&y)
    #define read3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define print(x) printf("%d
    ",x)
    #define mst(a,b) memset(a,b,sizeof(a))
    #define pb push_back
    #define mp make_pair
    const int inf = 0x3f3f3f3f;
    const int maxn = 1e6 + 5;
    int sum[maxn],mx[maxn];
    int cnt = 0;
    stack<int> s,q;
    int main(){
      for(int i = 0 ;i < maxn; i++)
        mx[i] = -inf;
      int t;
      read(t);
      getchar();
      char c;
      while(t--){
        scanf("%c",&c);
        getchar();
        if(c=='I'){
          int x;
          read(x);
          getchar();
          s.push(x);
          cnt++;
          sum[cnt] = sum[cnt-1] + x;
          mx[cnt] = max(mx[cnt-1],sum[cnt]);
        }
        if(c=='D'){
          if(cnt){
            cnt--;
            s.pop();
          }
        }
        if(c=='L'){
          if(cnt){
            cnt--;
            int top = s.top();
            s.pop();
            q.push(top);
          }
        }
        if(c=='R'){
            if(!q.empty()){
              cnt ++;
              int top = q.top();
              q.pop();
              s.push(top);
              sum[cnt] = sum[cnt-1]+top;
              mx[cnt] = max(mx[cnt-1],sum[cnt]);
            }
        }
        if(c=='Q'){
          int x ;
          read(x);
          getchar();
          print(mx[x]);
        }
      }
    }
  • 相关阅读:
    python入门之json与pickle数据序列化
    python入门之迭代器
    python入门之生成器
    阿里云-域名免费申请ssl证书过程
    mongodb的基本命令操作
    kibana通过nginx配置访问用户验证
    Java中常用的加密算法MD5,SHA,RSA
    Weka关联规则分析
    Swing实现系统托盘
    Swing实现右下角消息框
  • 原文地址:https://www.cnblogs.com/llke/p/10780120.html
Copyright © 2020-2023  润新知