P3372线段树 WA0pts 求调

P3372 【模板】线段树 1

Polaris_flame @ 2023-10-06 15:07:49

#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define int long long
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
using namespace std;
const int MAXN = 1e5 + 10;
int a[MAXN],tag[MAXN<<2],num[MAXN<<2];
void build(int x,int l,int r){
    tag[x]=0;
    if(l==r){
        num[x]=a[l];
        return;
    }
    build(ls,l,mid);
    build(rs,mid+1,r);
}
void pushup(int x){
    num[x]=num[ls]+num[rs];
}
void f(int x,int l,int r,int k){
    tag[x]+=k;
    num[x]+=(r-l+1)*k;
}
void pushdown(int x,int l,int r){
    f(ls,l,mid,tag[x]);
    f(rs,mid+1,r,tag[x]);
    tag[x]=0;
}
void add(int x,int l,int r,int L,int R,int k){
    if(l>=L&&r<=R){
        tag[x]+=k;
        num[x]+=(r-l+1)*k;
        return ;
    }
    pushdown(x,l,r);
    if(L<=mid) add(ls,l,mid,L,R,k);
    if(R>mid) add(rs,mid+1,r,L,R,k);
    pushup(x);
}
int query(int x,int l,int r,int L,int R){
    int res=0;
    if(l>=L&&r<=R) return num[x];
    pushdown(x,l,r);
    if(L<=mid) res+=query(ls,l,mid,L,R);
    if(R>mid) res+=query(rs,mid+1,r,L,R);
    return res;
}
signed main(){
    int n,m;
    scanf("%lld%lld",&n,&m);
    FL(i,1,n) scanf("%lld",&a[i]);
    build(1,1,n);
    FL(i,1,m){
        int op;
        scanf("%lld",&op);
        if(op==1){
            int x,y,k;
            scanf("%lld%lld%lld",&x,&y,&k);
            add(1,1,n,x,y,k);
        }
        else{
            int x,y;
            scanf("%lld%lld",&x,&y);
            printf("%lld\n",query(1,1,n,x,y));
        }
    }
}

QAQ样例过了但是全WA。


by Mini_PEKKA @ 2023-10-06 15:28:34

build 没 pushup


by Mini_PEKKA @ 2023-10-06 15:29:43

@Polaris_flame


by Polaris_flame @ 2023-10-06 15:50:32

@Mini_PEKKA 非常感谢QAQ,用我另一个小号关注您了

本来想着csp-s前过一下模板的结果WA了调不出来。。。


|