比楼下好一点(10 pts)

P3372 【模板】线段树 1

LAICZ @ 2023-07-18 11:28:10

#include <bits/stdc++.h>
#define lowbit(x) x&-x
using namespace std;

template <typename T>
struct BIT{
    int n;
    vector <T> bit;
    void fwk(int _n){
        n = _n;
        bit.resize(n);
    }

    void add(int pos,T val){
        int p = pos;
        while(p <= n){
            bit[p] += val;
            p += lowbit(p);
        }
    }

    T sum(int pos){
        int p = pos;
        T ret = 0;
        while(p > 0){
            ret += bit[p];
            p -= lowbit(p);
        }
        return ret;
    }

    T query(int l,int r){
        return sum(r) - sum(l - 1);
    }

};

BIT <int> d1,d,a;

int sum_a(int i){
    return (i + 1) * d.query(1,i) - d1.query(1,i);
}

int query_a(int l,int r){
    return sum_a(r) - sum_a(l - 1);
}

int main(){
    int n,m;
    cin>>n>>m;
    a.fwk(n + 5),d.fwk(n + 5),d1.fwk(n + 5);
    for(int i = 1;i <= n;i++){
        int t;
        cin>>t;
        a.add(i,t);
        d.add(i,t - a.query(i - 1,i - 1));
        d1.add(i,i * d.query(i,i));
    }
    for(int i = 1;i <= m;i++){
        int op,x,y,k;
        cin>>op>>x>>y;
        if(op == 1){
            cin>>k;
            d.add(x,k);
            d.add(y + 1,-k);
            d1.add(x,k * x);
            d1.add(y + 1,-k * x);
        }else{
            cout<<query_a(x,y)<<endl;
        }
    }
}

求调。BIT封装树状数组,里面操作肯定正确,怀疑是我公式推导出了问题

蒟蒻公式推导


by LAICZ @ 2023-07-18 11:29:02

d是正常对a的差分,d1是i倍的对应的d


|