1 条题解

  • 0
    @ 2026-5-9 11:46:21
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    
    const int N = 5e4 + 10,sqrtN = 250;
    // 区间加,单点查
    // a[i]记录每个点的值,b[i]记录每个点i所在块;
    // 每个块i的左端点L[i]、右端点R[i], 块内标记tag[i]
    int n, a[N], b[N], L[sqrtN], R[sqrtN], tag[sqrtN];
    
    signed main() {
        ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
        }
        int B = sqrt(n) ,cnt = (n+B-1)/B;// B为每块的长度,cnt为总块数
        for (int i = 1; i <= n; i++) {
            b[i] = (i - 1) / B + 1;
        }
        for (int i = 1; i <= cnt; i++) {
            L[i] = (i - 1) * B + 1;
            R[i] = min(i * B, n);
        }
        memset(tag, 0, sizeof(tag));
        for (int i = 1; i <= n; i++) {
            int op, l, r, c;
            cin >> op >> l >> r >> c;
            if (op == 0) {
                if (b[l] == b[r]) { // 如果l和r在同一块内
                    for (int i = l; i <= r; i++)
                        a[i] += c;
                } else {
                    for (int i = l; i <= R[b[l]]; i++)
                        a[i] += c;
                    for (int i = b[l] + 1; i <= b[r] - 1; i++)
                        tag[i] += c;
                    for (int i = L[b[r]]; i <= r; i++)
                        a[i] += c;
                }
            } else
                cout << a[r] + tag[b[r]] << '\n';
        }
        return 0;
    }
    
    
    
    • 1

    信息

    ID
    469
    时间
    100ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    103
    已通过
    23
    上传者