1 条题解

  • 0
    @ 2025-9-21 15:33:57

    首发题解😋

    分块可以平衡查询和操作的时间复杂度

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(0), cin.tie(0);
      
        int n;
        cin >> n;
      
        vector<int> a(n);
        for (auto &i : a) {
            cin >> i;
        }
      
    
        int block_size = sqrt(n);
        int block_count = (n + block_size - 1) / block_size;
        vector<int> lazy(block_count);
      
        for (int i = 0; i < n; ++i) {
            int opt, l, r, c;
            cin >> opt >> l >> r >> c;
      
            l--;
            r--;
      
            if (opt == 0) {
                // 区间[l, r]加上c
                int l_block = l / block_size;
                int r_block = r / block_size;
      
                if (l_block == r_block) {
                    // 同一区块内,直接暴力更新
                    for (int j = l; j <= r; ++j) {
                        a[j] += c;
                    }
                } else {
                    // 处理左半部分
                    for (int j = l; j < (l_block + 1) * block_size; ++j) {
                        a[j] += c;
                    }
                    // 处理中间完整的块
                    for (int b = l_block + 1; b < r_block; ++b) {
                        lazy[b] += c;
                    }
                    // 处理右半部分
                    for (int j = r_block * block_size; j <= r; ++j) {
                        a[j] += c;
                    }
                }
            } else {
                int b = r / block_size;
                cout << a[r] + lazy[b] << '\n';
            }
        }
      
        return 0;
    }
    
    • 1

    信息

    ID
    530
    时间
    100ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    15
    已通过
    2
    上传者