社区讨论

求调

P3372【模板】线段树 1参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhjueg9j
此快照首次捕获于
2025/11/04 08:40
4 个月前
此快照最后确认于
2025/11/04 08:40
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
void build(int,int,int);

const int maxn=1e5+1;

int a[4*maxn],flag[4*maxn];
int n,m;

int mid(int l,int r){
    return (l+r)/2;
}
int ls(int p){
    return (p*2);
}
int rs(int p){  
    return (p*2+1);
}
int siz(int l,int r){
    return (r-l+1);
}

void init(){
    cin>>n>>m;
    build(1,n,1);
}

void pushup(int p){
    a[p]=a[ls(p)]+a[rs(p)];
}
void pushdown(int l,int r,int p){
    if(flag[p]!=0){
        flag[ls(p)]=flag[rs(p)]=flag[p];
        a[ls(p)]=siz(l,mid(l,r))*flag[p];
        a[rs(p)]=siz(mid(l,r)+1,r)*flag[p];
        flag[p]=0;
    }
    return;
}

void build(int l,int r,int p){
    if(l==r){
        cin>>a[p];
        return;
    }
    int m=mid(l,r);
    build(l,m,ls(p));
    build(m+1,r,rs(p));
    pushup(p);
    return;
}

void update(int L,int R,int add,int l,int r,int p){
    if(L<=l && R>=r){
        flag[p]+=add;
        a[p]+=flag[p]*siz(l,r);
        return;
    }
    int m=mid(l,r);
    if(L<=m) update(L,R,add,l,m,ls(p));
    if(R>=m+1) update(L,R,add,m+1,r,rs(p));
    pushup(p);
    return;
}

int query(int L,int R,int l,int r,int p){
    int res=0;
    if(L<=l && R>=r){
        return a[p];
    }
    int m=mid(l,r);
    pushdown(l,r,p);
    if(L<=m) res+=query(L,R,l,m,ls(p));
    if(R>=m+1) res+=query(L,R,m+1,r,rs(p));
    return res;
}

int main(){
    init();
    for(int i=1;i<=m;i++){
        int temp;
        cin>>temp;
        if(temp==1){
            int x,y,k;
            cin>>x>>y>>k;
            update(x,y,k,1,n,1);
        }
        else{
            int x,y;
            cin>>x>>y;
            cout<<query(x,y,1,n,1)<<endl;
        }
    }
}

回复

2 条回复,欢迎继续交流。

正在加载回复...