#include <bits/stdc++.h> 
// #define For0(x) for (int i = 0; i < x; i++)
#define For(x) for (int i=1; i <=x; i++)
#define Fors(x,y) for(int i=1;i<=x;i++)for(int j=1;j<=y;j++)
#define rep(i,x,y) for(int i=x;i<=y;++i)
#define per(i,x,y) for(int i=y;i>=x;--i)
#define max_(x,y) x>y?x:y
#define min_(x,y) x<y?x:y
#define pii pair<int,int>
#define fi first
#define se second
#define dc(x,y) cout<<"debug:"<<"[" << x <<"]:"<<y<<endl 
#define all(x) (x).begin(),(x).end()
using namespace std;
#define ll long long

struct ltrst
{
    // int max_p
    vector<int> ltra,addt,a;
    explicit ltrst(int n) : ltra(n*4,0),addt(n*4,0) {}  
    void build(){
        build(0,a.size()-1,1);
    }
    void build(int l,int r,int p){

        if(l==r) {ltra[p]=a[l];return;}
        int mid = (l+r)/2;
        build(l,mid,p*2),build(mid+1,r,p*2+1);
        ltra[p]=ltra[p*2]+ltra[p*2+1];
    }
    int query(int l,int r){
        return query(l,r,1,a.size(),1);
    }
    int query(int l,int r,int s,int e,int p){
        if(l <= s && e <= r) return ltra[p];
        int mid = (s+e)/2, ans = 0;
        //处理addt
        if(addt[p]){
            int t = addt[p];
            addt[p]=0;
            addt[p*2]+=t,ltra[p*2]+=(mid-s+1)*t;
            addt[p*2+1]+=t,ltra[p*2+1]+=(e-mid+1)*t;
            
        }
        // s  e 从1-sizeof a 循环作用是迭代p的下标值
        // 全程是s e在动态变化,变化的方法等同于build,所以说一定以最优方式发生匹配
        if(l <= mid) ans += query(l, r, s, mid, p*2);     //l<=mid的时候,lr区间在mid左侧,二分
        if(r > mid) ans += query(l, r, mid+1, e, p*2+1);  //相反
        return ans;
    }
    void add(int l,int r,int t){
        add(l,r,1,a.size(),1,t);
    }
    void add(int l,int r,int s,int e,int p,int t){
        if(l <= s && e <= r) {
            ltra[p]+=((e-s+1)*t); //更新大区间的val
            addt[p]+=t; //下面的ltra不操作,更新addt,等访问到该p的时候再对下面的进行操作;
            return;
        }
        int nl=max_(l,s),nr=min_(r,e);
        ltra[p]+=(nr-nl+1)*t;
        int mid = (s+e)/2, ans = 0;
        if(l <= mid)  {add(l, r, s, mid, p*2, t);}
        if(r > mid) {add(l, r, mid+1, e, p*2+1, t);}
    }
    void pt(){
        int spn=2;
        for(int i=1;i<11;i++) {
            if(i%spn==0){
                cout<<endl;
                spn*=2;
            }
            printf("%d[%d] ",ltra[i],addt[i]);
        }
        cout<<endl<<endl;
    }

};

void solve() {
    ltrst ltr(5); 
    for(int i=10; i<=14; i++){
        ltr.a.push_back(i);
    }
    ltr.build();
    ltr.pt();

    ltr.add(3,5,5);
    ltr.pt();
    cout << endl;
    cout << ltr.query(3,4) << endl;
    // cout << ltr.query(1,4) << endl;

    
    
}
signed main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    int t=1;
    // cin >> t;
    while (t--) solve();
    // cout << solve() << '\n';
}
最后修改:2025 年 03 月 30 日 11 : 35 AM
如果觉得我的文章对你有用,请随意赞赏