求调(玄关

P3372 【模板】线段树 1

2012_Zhang_ @ 2024-11-17 07:24:02


#include<bits/stdc++.h>
using namespace std;
#define int long long
struct tree{
    int l,r,w,lzy;
}t[1000000];
bool in(int a,int b,int c,int d){return a<=b&&c<=d;}
bool out(int a,int b,int c,int d){return c<a||d<b;}
int x[1000000];
void build(int u,int L,int R){
    t[u].l=L,t[u].r=R,t[u].lzy=0;
    if(L==R){t[u].w=x[L]; return;}
    build(u*2,L,(L+R)/2);
    build(u*2+1,(L+R)/2+1,R);
    t[u].w=t[u*2].w+t[u*2+1].w;
    return;
}
void dlzy(int u,int L,int R,int x){
    if(out(L,t[u].l,t[u].r,R))return;
    if(in(L,t[u].l,t[u].r,R)){
        t[u].lzy+=x,t[u].w+=(t[u].r-t[u].l+1)*x;
        return;
    }
    dlzy(u*2,L,R,x);
    dlzy(u*2+1,L,R,x);
    t[u].w=t[u*2].w+t[u*2+1].w;
    return;
}
int ask(int u,int L,int R){
    if(out(L,t[u].l,t[u].r,R)){
        return 0;
    }
    if(in(L,t[u].l,t[u].r,R)){
        return t[u].w;
    }
    t[u*2].lzy=t[u].lzy,t[u*2].w+=(t[u*2].r-t[u*2].l+1)*t[u].lzy;
    t[u*2+1].lzy=t[u].lzy,t[u*2+1].w+=(t[u*2+1].r-t[u*2+1].l+1)*t[u].lzy;
    t[u].lzy=0;
    return ask(u*2,L,R)+ask(u*2+1,L,R);
}
signed main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>x[i];
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int op;
        cin>>op;
        if(op==1){
            int x,y,z;
            cin>>x>>y>>z;
            dlzy(1,x,y,z);
        }else{
            int x,y;
            cin>>x>>y;
            cout<<ask(1,x,y)<<endl;
        }
    }
}

by wild_asriel_X @ 2024-11-17 08:28:48

@2012Zhang 你的 dlzy 好像没有 push_down ,也不是 t[u].w=t[u*2].w+t[u*2+1].w+t[u].lzy*(t[u].r-t[u].l+1);,并且 ask push_down 时应该是 t[u*2].lzy+=t[u].lzyt[u*2+1].lzy+=t[u].lzy


by 2012_Zhang_ @ 2024-11-17 21:24:20

@wild_asriel_X 已过+已关 拜谢


|