社区讨论

调了一个小时 看不出错 求助

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mhj3dp96
此快照首次捕获于
2025/11/03 20:04
4 个月前
此快照最后确认于
2025/11/03 20:04
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=1e6+5;
ll num[4*N],ai[N],lt[4*N];
inline ll ls(ll p){
    return p<<1;
}
inline ll rs(ll p){
    return p<<1|1;
}
inline void push_up(ll p){
    num[p]=num[ls(p)]+num[rs(p)];
}
void build(ll l,ll r,ll p){
	lt[p]=0;
    if(l==r){
        num[p]=ai[l];
        return;
    }
    ll mid=(l+r)>>1;
    build(l,mid,ls(p));
    build(mid+1,r,rs(p));
    push_up(p);
}
inline void f(ll p,ll k,ll l,ll r){
    lt[p]+=k;
    num[p]+=(r-l+1)*k;
    return ;
}
inline void push_down(ll p,ll l,ll r){
    ll mid=(l+r)>>1;
    f(ls(p),lt[p],l,mid);
    f(rs(p),lt[p],mid+1,r);
    lt[p]=0;
}
void update(ll ul,ll ur,ll l,ll r,ll p,ll k){
    if(ul<=l&&ur>=r){
        lt[p]+=k;
    	num[p]+=(r-l+1)*k;
        return ;
    }
    push_down(p,l,r);
    ll mid=(l+r)>>1;
    if(ul<=mid)update(ul,ur,l,mid,ls(p),k);
    if(ur>mid)update(ul,ur,mid+1,r,ls(p),k);
    push_up(p);
}
inline ll query(ll ql,ll qr,ll l,ll r,ll p){
    if(ql<=l&&qr>=r){
        return num[p];
    }
    
    push_down(p,l,r);
    ll mid=(l+r)>>1;
    int ans=0;
	if(ql<=mid)ans+=query(ql,qr,l,mid,ls(p));
	if(qr>=mid+1)ans+=query(ql,qr,mid+1,r,rs(p));
	return ans;
}
int main(){
    int a,b;
    cin>>a>>b;
    for(int i=1;i<=a;i++){
        scanf("%d",&ai[i]);
    }
    build(1,a,1);
    for(int i=1;i<=b;i++){
        int c;
        cin>>c;
        if(c==1){
            int ul,ur,k;
            cin>>ul>>ur>>k;
            update(ul,ur,1,a,1,k);
        }
        else if(c==2){
            int ql,qr;
            cin>>ql>>qr;
            cout<<query(ql,qr,1,a,1)<<endl;
        }
    }
}
样例输入:
CPP
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
样例输出:
CPP
11
8
20
我的输出:
CPP
11
6
20

回复

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

正在加载回复...