1 条题解

  • 0
    @ 2025-6-1 9:14:27

    满分代码

    #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
    上传者