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\n",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]);
    }
  }
}

 

posted @ 2019-03-31 10:10  llke  阅读(214)  评论(0编辑  收藏  举报