题目链接:https://www.acwing.com/problem/content/130/
思路:就是把光标两边看成两个栈,左边一个右边一个中间是光标,然后
I是直接在左边的栈末尾插入一个数
D是把左边的栈栈顶出栈
L就是把右边的栈第一个数转移到左边
R就是把左边栈最后一个数转移到右边
Q就是保存左边栈的最大前缀和
这里我说一下我自己当时遇到的问题,就是在t2-- , t1++ , 就是在LR这里,因为代码数组是从1开始的,但是数组是0到n-1,所以有++ --的操作
代码:
#include<iostream>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e6 + 10;
int stk_left[N], stk_right[N];
int t1,t2;
int q;
string op;
int f[N], sum[N];
int main() {
f[0] = -INF;
cin >> q;
while (q--) {
cin >> op;
if (op == "I") {
int x;
cin >> x;
stk_left[++t1] = x;
sum[t1] = sum[t1 - 1] + stk_left[t1];
f[t1] = max(f[t1 - 1], sum[t1]);
} else if (op == "D") {
if (t1) {
t1--;
}
} else if (op == "L") {
if (t1) {
stk_right[++t2] = stk_left[t1--];
}
} else if (op == "R") {
if (t2) {
stk_left[++t1] = stk_right[t2--];
sum[t1] = sum[t1 - 1] + stk_left[t1];
f[t1] = max(f[t1 - 1], sum[t1]);
}
} else {
int k;
cin >> k;
cout << f[k] << endl;
}
} return 0 ;
}