6 条题解

  • 0
    @ 2025-9-13 11:26:59
    • 线段树实现,PPT 上的写法
    #include <bits/stdc++.h>
    using namespace std;
    
    struct SegmentTree {
    	int n;
    	vector<int> t;
    	
    	SegmentTree(int n_) {
    		n = n_;
    		t.assign(n * 2, 0);
    	}
    	
    	// 把原数组的 a[p] += v;
    	void update(int p, int v) {
    		p += n;  // 把 p 变成 t 中的编号
    		t[p] += v;
    		for (int i = p / 2; i >= 1; i /= 2) {
    			t[i] = t[i * 2] + t[i * 2 + 1];
    		}
    	}
    	
    	// 查询原数组 a[l], a[l + 1], ... a[r] 的和
    	int query(int l, int r) {
    		l += n, r += n;  // 把 l, r 变成 t 数组的下标
    		int ans = 0;
    		while (l <= r) {
    			if (l % 2 == 1) ans += t[l], l++;
    			if (r % 2 == 0) ans += t[r], r--;
    			l /= 2, r /= 2;
    		}
    		return ans;
    	}
    };
    
    int main() {
    	int n, m, x, cmd, l, r, p;
    	cin >> n >> m;
    	SegmentTree seg(n);
    	for (int i = 0; i < n; i++) {
    		cin >> x;
    		seg.update(i, x);  // 单点更新
    	}
    	
    	while (m--) {
    		cin >> cmd;
    		if (cmd == 1) {
    			cin >> p >> x;
    			seg.update(p - 1, x);  // 单点更新
    		} else {
    			cin >> l >> r;
    			cout << seg.query(l - 1, r - 1) << '\n';
    		}
    	}
    	
    	return 0;
    }
    

    信息

    ID
    81
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    97
    已通过
    30
    上传者