zero needs help!

P3372 【模板】线段树 1

zsz0804_ @ 2024-11-07 20:28:14

大佬们,样例输出 8 5 4。

本人代码丑陋。

#include<bits/stdc++.h>
#define int long long
#define N 1000010
using namespace std;
int a[N],tree[4*N],tag[4*N],n,m,op,x,y,k;
int ls(int p){return p>>1;}
int rs(int p){return p>>1|1;}
void update(int p){
    tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(int p,int pl,int pr){
    if(pl==pr){
        tree[p]=a[pl];
        return;
    }
    int mid=(pl+pr)>>1;
    build(ls(p),pl,mid);
    build(rs(p),mid+1,pr);
}
void tagd(int pl,int pr,int p){
    int mid=(pl+pr)>>1;
    if(tag[p]>0){
        tag[ls(p)]=tag[rs(p)]=tag[p];
        tree[ls(p)]=(mid-pl+1)*tag[p];
        tree[rs(p)]=(pr-mid)*tag[p];
        tag[p]=0;
    }
}
int que2(int l,int r,int pl,int pr,int p){
    if(l<=pl&&pr<=r){
        return tree[p];
    }
    tagd(pl,pr,p); 
    int mid=(pl+pr)>>1,ans=0;
    if(l<=mid){
        ans+=que2(l,r,pl,mid,ls(p));
    }
    if(mid<r){
        ans+=que2(l,r,mid+1,pr,rs(p));
    }
    return ans;
}
void ch2(int i,int v,int pl,int pr,int p){
    if(pl==pr){
        tree[p]=v;
        return;
    }
    tagd(pl,pr,p);
    int mid=(pl+pr)>>1;
    if(i<=mid){
        ch2(i,v,pl,mid,ls(p));
    }else{
        ch2(i,v,mid+1,pr,rs(p));
    }
    update(p);
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i]; 
    }
    build(1,1,n);
    while(m--){
        cin>>op>>x>>y;
        if(op==1){
            cin>>k;
            update(k);
        }else{
            cout<<que2(x,y,1,n,1)<<"\n";
        }
    }
    return 0;
}

AC回关


by Mugino_Shizuri @ 2024-11-07 20:36:20

build 没 pushup


by Mugino_Shizuri @ 2024-11-07 20:37:07

ee,update,说错了。


by Mugino_Shizuri @ 2024-11-07 20:39:04

tagd 不能直接赋值。


by Mugino_Shizuri @ 2024-11-07 20:40:05

你这是在写什么?


by Mugino_Shizuri @ 2024-11-07 20:40:24

ch2 用过吗?


by Mugino_Shizuri @ 2024-11-07 20:40:47

ch2 也是错的,不能直接赋值。


by Mugino_Shizuri @ 2024-11-07 20:42:02

你在单点修改吗?


|