1 条题解
-
0
使用封装了的线段树完成的例子
#include <bits/stdc++.h> #define int long long using namespace std; const int MAXN = 200000 + 5; int D; struct SegTree { int sum[MAXN * 4], maxx[MAXN * 4]; void build(int o, int l, int r) { if (l == r) { sum[o] = maxx[o] = 0; return; } int mid = (l + r) >> 1; build(o * 2, l, mid); build(o * 2 + 1, mid + 1, r); sum[o] = sum[o * 2] + sum[o * 2 + 1]; maxx[o] = max(maxx[o * 2], maxx[o * 2 + 1]); } int query_max(int o, int l, int r, int ql, int qr) { if (l > qr || r < ql) return -1; if (ql <= l && r <= qr) return maxx[o]; int mid = (l + r) >> 1; return max(query_max(o * 2, l, mid, ql, qr), query_max(o * 2 + 1, mid + 1, r, ql, qr)); } int query_sum(int o, int l, int r, int ql, int qr) { if (l > qr || r < ql) return 0; if (ql <= l && r <= qr) return sum[o]; int mid = (l + r) >> 1; return query_sum(o * 2, l, mid, ql, qr) + query_sum(o * 2 + 1, mid + 1, r, ql, qr); } void update(int o, int l, int r, int x, int t) { if (l == r) { maxx[o] = sum[o] = t; return; } int mid = (l + r) >> 1; if (x <= mid) update(o * 2, l, mid, x, t); // 左右分别更新 else update(o * 2 + 1, mid + 1, r, x, t); sum[o] = sum[o * 2] + sum[o * 2 + 1]; maxx[o] = max(maxx[o * 2], maxx[o * 2 + 1]); } } st; int m, cnt, t, n; int a[MAXN]; signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> m >> D; n = m; st.build(1, 1, n); cnt = t = 0; while (m--) { char op; int x; cin >> op >> x; if (op == 'A') { cnt++; st.update(1, 1, n, cnt, (t + x) % D); } else if (op == 'Q') { t = st.query_max(1, 1, n, cnt - x + 1, cnt); cout << t << "\n"; } } return 0; }
- 1
信息
- ID
- 2015
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 26
- 已通过
- 10
- 上传者