- C++
P1486 [NOI2004] 郁闷的出纳员
- @ 2025-8-21 16:19:29
代码
2 条评论
-
-
#include<bits/stdc++.h> using namespace std; const int N = 1000005; int val[N], dat[N], son[N][2], siz[N], rt; int base_min, mn, leave_count; void split(int p, int x, int &l, int &r) { if (!p) { l = r = 0; return; } if (val[p] <= x) { l = p; split(son[p][1], x, son[p][1], r); } else { r = p; split(son[p][0], x, l, son[p][0]); } siz[p] = siz[son[p][0]] + siz[son[p][1]] + 1; } int merge(int l, int r) { if (!l || !r) return l + r; if (dat[l] > dat[r]) { son[l][1] = merge(son[l][1], r); siz[l] = siz[son[l][0]] + siz[son[l][1]] + 1; return l; } else { son[r][0] = merge(l, son[r][0]); siz[r] = siz[son[r][0]] + siz[son[r][1]] + 1; return r; } } void insert(int x) { static int idx = 0; int l, r; split(rt, x, l, r); val[++idx] = x; dat[idx] = rand(); siz[idx] = 1; rt = merge(merge(l, idx), r); } int kth(int p, int k) { if (k == siz[son[p][0]] + 1) return p; if (k <= siz[son[p][0]]) return kth(son[p][0], k); return kth(son[p][1], k - siz[son[p][0]] - 1); } int main() { srand(time(NULL)); int n; cin >> n >> base_min; mn = 0; leave_count = 0; while(n--) { char op; int k; cin >> op >> k; if (op == 'I') { if (k >= base_min) { insert(k - mn); } } else if (op == 'A') { mn += k; } else if (op == 'S') { mn -= k; int threshold = base_min - mn; int l, r; split(rt, threshold - 1, l, r); leave_count += siz[l]; rt = r; } else if (op == 'F') { int total = siz[rt]; if (k > total || k < 1) { cout << -1 << '\n'; } else { int real_k = total - k + 1; int node = kth(rt, real_k); cout << val[node] + mn << '\n'; } } } cout << leave_count << endl; return 0; } -
while(n--) { char op; int k; cin >> op >> k; if (op == 'I') { if (k >= base_min) { insert(k - mn); } } else if (op == 'A') { mn += k; } else if (op == 'S') { mn -= k; int threshold = base_min - mn; int l, r; split(rt, threshold - 1, l, r); leave_count += siz[l]; rt = r; } else if (op == 'F') { int total = siz[rt]; if (k > total || k < 1) { cout << -1 << '\n'; } else { int real_k = total - k + 1; int node = kth(rt, real_k); cout << val[node] + mn << '\n'; } } } cout << leave_count << endl;
- 1