全部WA,求调

P3372 【模板】线段树 1

shu_ye @ 2024-07-18 11:58:00

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,a[1000010]={},t[2000010]={},tag[2000010]={};
void buid(int f,int l,int r){
    if(l==r){
        t[f]=a[l];
        return;
    }
    int mid=(l+r)/2;
    buit(f*2,l,mid);
    buit(f*2+1,mid+1,r);
    t[f]=t[f*2]+t[f*2+1];
}
void push(int left,int right,int f){
   int mid=(left+right)>>1;
   t[f<<1]+=tag[f]*(mid-left+1);
   t[f<<1|1]+=tag[f]*(right-mid);
   tag[f<<1]=tag[f];
   tag[f<<1|1]=tag[f];
   tag[f]=0;
}
int query(int l,int r,int left,int right,int f){
    int ans=0;
    if(l<=left&&r>=right){
        return t[f];
    }
    int mid=(left+right)/2;
    push(left,right,f);
    if(l<=mid){
        ans+=query(l,r,left,mid,f*2);
    }
    if(r>mid){
        ans+=query(l,r,mid+1,right,f*2+1);
    }
    return ans;
}
void update(int l,int r,int left,int right,int f,int k){
   if(l<=left&&r>=right){
       t[f]+=k*(right-left+1);
       tag[f]+=k;
       return;
   }
   push(left,right,f);
   int mid=(left+right)>>1;
   if(l<=mid) update(l,r,left,mid,f<<1,k);
   if(r>mid) update(l,r,mid+1,right,f<<1|1,k);
   t[f]=t[f<<1]+t[f<<1|1];
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    buit(1,1,n);
    while(m--){
        int c,l,r,k;
        scanf("%lld%lld%lld",&c,&l,&r);
        if(c==2){
            printf("%lld\n",query(l,r,1,n,1));
        }
        else{
            scanf("%lld",&k);
            update(l,r,1,n,1,k);
        }
    }
} 

by Mini_PEKKA @ 2024-07-18 12:04:18

tag[f<<1]=tag[f];
tag[f<<1|1]=tag[f];

改为

tag[f<<1]+=tag[f];
tag[f<<1|1]+=tag[f];

by shu_ye @ 2024-07-18 12:09:27

@Mini_PEKKA 临表涕零,不知所言。 太感谢了


|