编辑器
问题描述
你将要实现一个功能强大的整数序列编辑器。
在开始时,序列是空的。
编辑器共有五种指令,如下:
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
样例解释
下图包含了对样例的过程描述:
题解
用两个栈就能模拟过程
代码
#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]); } } }