1 条题解
-
0
满分代码
#include <bits/stdc++.h> using namespace std; // 最大车厢数:5e5,加上若干余量 const int MAXN = 500000 + 5; int n, k; // n:车厢总数;k:事件总数 int bit[MAXN]; // 树状数组,bit[i] 存储若干区间和,用于快速前缀查询 // lowbit:返回 x 的最低位 1 对应的值,Fenwick Tree 常用 inline int lb(int x) { return x & -x; } // upd:在树状数组上,对下标 i(1 ≤ i ≤ n)加上 val(可正可负) // 作用:当第 m 节车厢上车或下车时,更新该节车厢学生数变化 // 名称长度 ≤ 7 void upd(int i, int val) { // 从 i 开始,不断 i += lowbit(i),把 val 累加到所有“覆盖”i 的节点上 for (; i <= n; i += lb(i)) { bit[i] += val; } } // qry:查询树状数组的前缀和,得到 [1..i] 范围内学生总数 // 名称长度 ≤ 7 int qry(int i) { int s = 0; // 从 i 开始,不断 i -= lowbit(i),累加所有相关节点的值 for (; i > 0; i -= lb(i)) { s += bit[i]; } return s; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); // 读入车厢总数 n 和事件数 k cin >> n >> k; // 初始时,树状数组全部清零 memset(bit, 0, sizeof(bit)); // 逐条处理 k 个事件 for (int i = 0; i < k; i++) { char op; cin >> op; if (op == 'A') { // A m:年级主任走到第 m 节车厢,询问前 m 节车厢总学生数 int m; cin >> m; // qry(m) 即可获取前 m 节车厢的学生前缀和 int ans = qry(m); cout << ans << "\n"; } else if (op == 'B') { // B m p:第 m 节车厢有 p 名学生上车 int m, p; cin >> m >> p; // 对节 m 做 +p 更新 upd(m, p); } else { // C m p:第 m 节车厢有 p 名学生下车 int m, p; cin >> m >> p; // 对节 m 做 -p 更新 upd(m, -p); } } return 0; }
- 1
信息
- ID
- 994
- 时间
- 200ms
- 内存
- 512MiB
- 难度
- 9
- 标签
- 递交数
- 10
- 已通过
- 4
- 上传者