知识点:栈
这个题属于稍微难一点的,首先我们根据这个题是在序列的中间进行操作,那么可以想到使用对顶栈,类似于对顶堆的写法,两个栈就是第一个是从序列的开头到光标,第二个是从序列的光标到结尾,栈顶都是光标的方向,那么这里需要注意的就是栈的细节,我们搞清楚光标左边光标右边是什么意思,这个看原题的样例就行了,然后就是最后的输出答案,首先把这个输出答案是什么意思搞懂,它这里的前缀是严格从1开始的,也就是说如果输入是5的话,那么就是从1到1,1到2,1到3等等,这5个前缀里面找出最大的,那么显然的,我们要开一个数组来记录前缀和,然后再开一个数组,f[5]的意思就是前5个前缀和里面的最大值,这样查询的时候我们直接输出就行了,
想了想,感觉这个题是可以用对顶栈做,但不是必须用对顶栈做,队列就不说了,感觉链表也是可以的啊,但是现在还没看到链表那里,等看到的时候用链表来写写
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
const int Inf = 1e9 + 5;
int L[N], R[N], a[N], b[N];
int main() {
int q;
while (cin >> q) {
int cnt1 = 0, cnt2 = 0;
for (int i = 0; i < N; i++) b[i] = -Inf;
while (q--) {
char op;
getchar();
scanf("%c", &op);
int x;
if (op == 'I') {
scanf("%d", &x);
L[++cnt1] = x;
a[cnt1] = a[cnt1 - 1] + x;
b[cnt1] = max(b[cnt1 - 1], a[cnt1]);
} else if (op == 'D') {
if (cnt1) cnt1--;
} else if (op == 'L') {
if (cnt1) R[++cnt2] = L[cnt1--];
} else if (op == 'R') {
if (cnt2) {
L[++cnt1] = R[cnt2--];
a[cnt1] = a[cnt1 - 1] + L[cnt1];
b[cnt1] = max(b[cnt1 - 1], a[cnt1]);
}
} else {
scanf("%d", &x);
printf("%d\n", b[x]);
}
}
}
return 0;
}