《线段树懒标记RE惹》
查看原帖
《线段树懒标记RE惹》
590609
jiangjiangQwQ楼主2023/4/28 20:21
#include<iostream>
using namespace std;
const int N=6e5+5;
//#define int long long
struct node{
    int l,r;
    int tag,sum;
}t[N<<2];
void push_down(int l,int r,int c){
    t[c*2].sum+=(t[c*2].r-t[c*2].l+1)*t[c].tag;
    t[c*2+1].sum+=(t[c*2+1].r-t[c*2+1].l+1)*t[c].tag;
    t[c*2].tag+=t[c].tag;
    t[c*2+1].tag+=t[c].tag;
    t[c].tag=0;
}
void build(int l,int r,int c){
    t[c].l=l;t[c].r=r;
    if(l==r){
        cin>>t[c].sum;
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,c*2);
    build(mid+1,r,c*2+1);
    t[c].sum=t[c*2].sum+t[c*2+1].sum;
    return;
}
int query(int l,int r,int c){
    if(l<=t[c].l&&r>=t[c].r) return t[c].sum;
    if(t[c].tag) push_down(l,r,c);
    int mid=(l+r)>>1;
    int ans=0;
    if(l<=mid) ans+=query(l,r,c*2);
    if(r>mid) ans+=query(l,r,c*2+1);
    return ans;
}
void modify(int l,int r,int c,int k){
    if(l<=t[c].l&&r>=t[c].r){
        t[c].tag+=k;
        t[c].sum+=(t[c].r-t[c].l+1)*k;
        return;
    }
    if(t[c].tag) push_down(l,r,c);
    int mid=(l+r)>>1;
    if(l<=mid) modify(l,r,c*2,k);
    if(r>mid) modify(l,r,c*2+1,k);
    t[c].sum=t[c*2].sum+t[c*2+1].sum;
    return;
}
signed main(){
    int n;
    cin>>n;
    build(1,n,1);
    int q,op,x,y,k;
    cin>>q;
    while(q--){
        cin>>op;
        if(op==1){
            cin>>x>>y>>k;
            modify(x,y,1,k);
        }else{
            cin>>x>>y;
            cout<<query(x,y,1)<<'\n';
        }
    }
    return 0;
}

一道区间查询和区间修改的线段树基本题,rt喜提RE

2023/4/28 20:21
加载中...