求助

P3372 【模板】线段树 1

0720wangyuxiang @ 2025-01-11 19:46:49

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N],n,ans,m;
struct node{
    int l;
    int r;
    int data;
    int tag;
}t[4*N];
void build(int L,int R,int i){
    t[i].l=L;
    t[i].r=R;
    if(L==R){
        t[i].data=a[L];
        return;
    }
    int mid=(L+R)/2;
    build(L,mid,i*2);
    build(mid+1,R,i*2+1);
    t[i].data=t[i*2].data+t[i*2+1].data; 
    return ;
}
//int build2(int i){
//  if(t[i].l==t[i].r){
//      t[i].data=a[t[i].l];
//      return t[i].data;
//  }
//  t[i].data=build2(i*2)+build2(i*2+1);
//  return t[i].data;
//}
void spread(int i){
    if(t[i].tag){
        t[i*2].data+=t[i].tag*(t[i*2].r-t[i*2].l+1);
        t[i*2+1].data+=t[i].tag*(t[i*2+1].r-t[i*2+1].l+1);
        t[i*2].tag+=t[i].tag;
        t[i*2+1].tag+=t[i].tag;
        t[i].tag=0;
    }
    return ;
}
void modifty(int i,int L,int R,int k){
    if(L<=t[i].l&&t[i].r<=R){
        t[i].data+=k*(t[i].r-t[i].l+1);
        t[i].tag+=k;
        return ;
    }
    spread(i);
    if(L<=t[i*2].r)modifty(i*2,L,R,k);
    if(t[i*2+1].l<=R)modifty(i*2+1,L,R,k);
    return ;
}
void fnd(int i,int L,int R){
    if(L<=t[i].l&&t[i].r<=R){
        ans+=t[i].data;
        return ;
    }
    spread(i);
    if(L<=t[i*2].r)fnd(i*2,L,R);
    if(t[i*2+1].l<=R)fnd(i*2+1,L,R);
    return ;
}
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,n,1);
    //build2(1);
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        if(x==1){
            int k;
            cin>>k;
            modifty(1,y,z,k);
        }
        else{
            ans=0;
            fnd(1,y,z);
            cout<<ans<<'\n';
        }
    }
    return 0;
}

by _xguagua_Firefly_ @ 2025-01-11 20:06:53

@0720wangyuxiang

modify 以后没有 pushup 导致的。

void modifty(int i,int L,int R,int k){
    if(L<=t[i].l&&t[i].r<=R){
        t[i].data+=k*(t[i].r-t[i].l+1);
        t[i].tag+=k;
        return ;
    }
    spread(i);
    if(L<=t[i*2].r)modifty(i*2,L,R,k);
    if(t[i*2+1].l<=R)modifty(i*2+1,L,R,k);
    t[i].data=t[i*2].data+t[i*2+1].data; // Here 
    return ;
}

by 0720wangyuxiang @ 2025-01-11 20:54:54

@_xguaguaFirefly 谢谢


|