题目描述
https://acm.hdu.edu.cn/showproblem.php?pid=4699
简要题意:你现在正在使用一个打字机,当前内容为空,光标在 $0$ 处。现在有 $n$ 个操作,操作有五种,第一个操作是在光标处插入一个字符 $x$,同时光标右移;第二种操作是删除光标左边的一个字符;第三种操作是将光标右移;第四种操作是将光标左移;第五种操作是给定 $k(1\le k\le n)$,求 $max_{1\le i\le k}s_i$,其中 $s_k=\sum_{i=1}^ka_i$,$n$ 为光标左端的字符总数
$n\le 10^6$
Solution
我们维护两个对顶栈模拟操作即可
时间复杂度 $O(n)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include <iostream> #include <stack> #define maxn 1000010 #define INF 1000000000 using namespace std;
int q, n, m; int S[maxn], T[maxn];
int s[maxn], f[maxn]; inline void solve_1() { int x; cin >> x; S[++n] = x; s[n] = s[n - 1] + x; f[n] = max(f[n - 1], s[n]); }
inline void solve_2() { if (!n) return ; --n; }
inline void solve_3() { if (!n) return ; T[++m] = S[n--]; }
inline void solve_4() { if (!m) return ; S[++n] = T[m--]; s[n] = s[n - 1] + S[n]; f[n] = max(f[n - 1], s[n]); }
inline void solve_5() { int x; cin >> x; cout << f[x] << "\n"; }
void work() { s[0] = 0; f[0] = -INF; n = m = 0; for (int i = 1; i <= q; ++i) { char c[3]; cin >> c; switch (c[0]) { case 'I': solve_1(); break; case 'D': solve_2(); break; case 'L': solve_3(); break; case 'R': solve_4(); break; case 'Q': solve_5(); break; } } }
int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
while (cin >> q) work(); return 0; }
|