线段树10分求助

P3372 【模板】线段树 1

Orange1015 @ 2023-02-24 23:59:12

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 100005
int n,m,op;
int a[maxn];
struct node{
    int l,r,sum=0,mul=1,lazy=0;
}t[maxn << 2];
void update(int id){
    t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
    return;
}
void buildtree(int id,int l,int r){
    t[id].l=l;
    t[id].r=r;
    if(l==r){
        t[id].sum=a[l];
        return; 
    }
    int mid=(l+r)>>1;
    buildtree(id<<1,l,mid);
    buildtree(id<<1|1,mid+1,r);
    update(id);
    return;
}
void pushdown(int id){
    if(t[id].lazy){
        t[id<<1].lazy+=t[id].lazy;
        t[id<<1].sum+=(t[id<<1].r-t[id].l+1)*t[id].lazy;
        t[id<<1|1].lazy+=t[id].lazy;
        t[id<<1|1].sum+=(t[id].r-t[id].l+1)*t[id].lazy;
        t[id].lazy=0;
    }
    return;
}
void change(int id,int l,int r,int val){
    if(l<=t[id].l && t[id].r<=r){
        t[id].lazy+=val;
        t[id].sum+=(t[id].r-t[id].l+1)*val;
        return;
    }
    pushdown(id);
    int mid=(t[id].l+t[id].r)>>1;
    if(l<=mid) change(id<<1,l,r,val);
    if(r>mid) change(id<<1|1,l,r,val);
    update(id);
    return;
}
int query(int id,int l,int r){
    if(l<=t[id].l && r>=t[id].r){
        return t[id].sum;
    }
    pushdown(id);
    int mid=(t[id].l+t[id].r)>>1;
    int ans=0;
    if(l<=mid) ans+=query(id<<1,l,r);
    if(r>mid) ans+=query(id<<1|1,l,r);
    return ans;
}
signed main(){
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for(int i=1;i<=n;i++){
        cin >> a[i];
    }
    buildtree(1,1,n);
    while(m--){
        cin >> op;
        if(op==1){
            int x,y,k;
            cin >> x >> y >> k;
            change(1,x,y,k);
        }
        else{
            int x,y;
            cin >> x >> y;
            cout << query(1,x,y) << '\n';
        }
    }
    return 0;
}

by LOVE_Ynoi @ 2023-02-25 06:50:00

pushdown里的第三行和第五行

t[id<<1].sum+=(t[id<<1].r-t[id].l+1)*t[id].lazy;

t[id<<1|1].sum+=(t[id].r-t[id].l+1)*t[id].lazy;

改成这样

t[id<<1].sum+=(t[id<<1].r-t[id<<1].l+1)*t[id].lazy;

t[id<<1|1].sum+=(t[id<<1|1].r-t[id<<1|1].l+1)*t[id].lazy;


by Orange1015 @ 2023-02-25 11:26:46

@wsy20080329 orz


|