1 条题解

  • 0
    @ 2025-3-26 19:23:02
    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N = 2e6 + 5;
    int t1[N], t2[N], n;
    int a[N] = {0}, d[N];
    
    int lowbit(int x) {
        return x & -x;
    }
    
    void init() {
        for (int i = 1; i <= n ; i++) {
            t1[i] += d[i];
            t2[i] += d[i] * i;
            int j = i + lowbit(i);
    
            if (j <= n)
                t1[j] += t1[i], t2[j] += t2[i];
        }
    }
    
    void add(int x, int k) {
        int v = x * k;
    
        while (x <= n) {
            t1[x] += k;
            t2[x] += v;
            x += lowbit(x);
        }
    }
    
    void add(int l, int r, int v) {
        add(l, v), add(r + 1, -v);
    }
    
    int getsum(int x) { // sum(1 - x)
        int ans = 0;
        int l = x + 1;
    
        while (x > 0) {
            ans += ((t1[x] * l) - t2[x]);
            x -= lowbit(x);
        }
    
        return ans;
    }
    
    int getsum(int l, int r) {
        return getsum(r) - getsum(l - 1);
    }
    
    void solve() {
        int m;
        cin >> n >> m;
    
        for (int i = 1; i <= n ; i++) {
            cin >> a[i];
            d[i] = a[i] - a[i - 1];
        }
    
        init();
    
        while (m--) {
            int o;
            cin >> o;
    
            if (o == 1) {
                int x, y, k;
                cin >> x >> y >> k;
                add(x, y, k);
            } else {
                int x, y;
                cin >> x >> y;
                cout << getsum(x, y) << '\n';
            }
        }
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int t = 1;
        //cin >> t;
    
        while (t--) {
            solve();
        }
    
        return 0;
    }
    
    • 1

    「一本通 4.3 例 2」区间和-区间修改

    信息

    ID
    1004
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者