题解:

建立两个栈,都以光标所在的那一端作为栈顶。

//#include<bits/stdc++.h>
#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include  <cassert>
#include   <cstdio>
#include   <vector>
#include   <string>
#include    <cmath>
#include    <queue>
#include    <stack>
#include      <set>
#include      <map>
using namespace std;
#define P(a,b,c) make_pair(a,make_pair(b,c))
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef pair<int,pair<int,int> >pii;
typedef long long ll;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
ll gcd(ll a, ll b) {
	return b ? gcd(b, a%b) : a;
}
const int maxn=1e6+5;
int A[maxn],B[maxn];
int f[maxn],sum[maxn];
char t[10];
int n,num;
int main() {
	while(~scanf("%d", &n)) {
		f[0]=-INF;
		sum[0]=0;
		int cnt_A=0;
		int cnt_B=0;
		while(n--) {
			scanf("%s", t);
			if(t[0]=='I') {
				scanf("%d", &A[++cnt_A]);
				sum[cnt_A]=sum[cnt_A-1]+A[cnt_A];
				f[cnt_A]=max(f[cnt_A-1],sum[cnt_A]);
			}
			if(t[0]=='D'&&cnt_A!=0) {
				cnt_A--;
			}
			if(t[0]=='L'&&cnt_A!=0) {
				B[++cnt_B]=A[cnt_A--];
			}
			if(t[0]=='R'&&cnt_B!=0) {
				A[++cnt_A]=B[cnt_B--];
				sum[cnt_A]=sum[cnt_A-1]+A[cnt_A];
				f[cnt_A]=max(f[cnt_A-1],sum[cnt_A]);
			}
			if(t[0]=='Q') {
				scanf("%d", &num);
				printf("%d\n", f[num]);
			}
		}
	}

	return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注