题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=4699
分析
对顶栈,注意最大前缀和可能为负数。
AC代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
inline int read() {
int num = 0, flag = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') flag = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return flag * num;
}
const int maxn = 1e6 + 5;
int n, s[maxn], f[maxn];
stack<int> a, b;
int main() {
f[0] = -0x3f3f3f3f;
while (scanf("%d", &n) == 1) {
while (!a.empty()) a.pop();
while (!b.empty()) b.pop();
while (n--) {
char op[2];
scanf("%s", op);
if (op[0] == 'I') {
int x = read();
a.push(x);
s[a.size()] = s[a.size() - 1] + x;
f[a.size()] = max(f[a.size() - 1], s[a.size()]);
}
else if (op[0] == 'D' && !a.empty()) a.pop();
else if (op[0] == 'L' && !a.empty()) b.push(a.top()), a.pop();
else if (op[0] == 'R' && !b.empty()) {
a.push(b.top()), b.pop();
s[a.size()] = s[a.size() - 1] + a.top();
f[a.size()] = max(f[a.size() - 1], s[a.size()]);
}
else if (op[0] == 'Q') {
int k = read();
printf("%d\n", f[k]);
}
}
}
return 0;
}