再次求指点

P3372 【模板】线段树 1

福明o7 @ 2023-04-05 23:48:21

我改了一个错,但是为啥总输出15 25 30?

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100005;
int a[N],w[N*4];
int lzy[N*4];
int n,m;
void make_tag(int u,int len,int x){
    lzy[u]+=x;
    w[u]+=len*x;
    return;
}
void pushdown(int u,int L,int R){
    int mid=L+R>>1;
    make_tag(u*2,mid-L+1,lzy[u]);
    make_tag(u*2+1,R-mid,lzy[u]);
    lzy[u]=0;
    return;
}
bool inrange(int L,int R,int l,int r){
    return(r<=R)&&(L<=l);
}
bool outofrange(int L,int R,int l,int r){
    return (L>r)||(R<l);
}
void pushup(int x){
    w[x]=w[x*2]+w[x*2+1];
    return;
}
void build(int u,int L,int R){
    if(L==R){
        w[u]=a[L];
        return;
    }
    int mid=L+R>>1;
    build(u*2,L,mid);
    build(u*2+1,mid+1,R);
    pushup(u);
    return;
}
int query(int u,int L,int R,int l,int r){
    if(inrange(L,R,l,r)){
        return w[u];
    } 
    else if(!outofrange(L,R,l,r)){
        int mid=L+R>>1;
        pushdown(u,L,R);
        return query(u*2,L,mid,l,r)+query(u*2+1,mid+1,R,l,r);
    }
    else{
        return 0;
    }
}
void update(int u,int L,int R,int l,int r,int x){
    if(inrange(L,R,l,r)){
        make_tag(u,R-L+1,x);
    }
    else if(!outofrange(L,R,l,r)){
        int mid=L+R>>1;
        pushdown(u,L,R);
        update(u*2,L,mid,l,r,x);
        update(u*2+1,mid+1,R,l,r,x);
        pushup(u);
    }
    return;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    for(int t=1;t<=m;t++){
        int op,x,y;
        int k;
        cin>>op;
        if(op==1){
            cin>>x>>y>>k;
            update(1,1,n,x,y,k);
        }
        else{
            cin>>x>>y;
            cout<<query(1,1,n,x,y)<<"\n";
        }
    }
    return 0;
}

by 5k_sync_closer @ 2023-04-06 09:38:50

@福明o7 你 inrange 判错了吧,应该判 [l,r] 包含 [L,R]


by 福明o7 @ 2023-04-06 12:45:46

@5k_sync_closer 谢谢大佬,过了。 深进害人不浅,代码错的离谱


|