社区讨论

0分求调

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mjmb1jee
此快照首次捕获于
2025/12/26 11:21
2 个月前
此快照最后确认于
2025/12/27 21:15
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
ll a[N],tree[N<<2],tag[N<<2];
void build(ll p,ll pl,ll pr){
    tag[p]=0;
    if(pl==pr){tree[p]=a[p];return;}
    ll mid=(pl+pr)>>1;
    build(p<<1,pl,mid);
    build(p<<1|1,mid+1,pr);
    tree[p]=tree[p<<1]+tree[p<<1|1];
}
void addtag(ll p,ll pl,ll pr,ll d){
    tag[p]+=d;
    tree[p]+=d*(pr-pl+1);
}
void push_down(ll p,ll pl,ll pr){
    if(tag[p]){
        ll mid=(pl+pr)>>1;
        addtag(p<<1,pl,mid,tag[p]);
        addtag(p<<1|1,mid+1,pr,tag[p]);
        tag[p]=0;
    }
}
void update(ll l,ll r,ll p,ll pl,ll pr,ll d){
    if(l<=pl&&pr<=r){addtag(p,pl,pr,d);return;}
    push_down(p,pl,pr);
    ll mid=(pl+pr)>>1;
    if(l<=mid) update(l,r,p<<1,pl,mid,d);
    if(r>mid) update(l,r,p<<1|1,mid+1,pr,d);
    tree[p]=tree[p<<1]+tree[p<<1|1];
}
ll query(ll l,ll r,ll p,ll pl,ll pr){
	if(l<=pl&&pr<=r) return tree[p];
	push_down(p,pl,pr);
	ll mid=(pl+pr)>>1,sum=0;
	if(l<=mid) sum+=query(l,r,p<<1,pl,mid);
	if(r>mid) sum+=query(l,r,p<<1|1,mid+1,pr);
	return sum;
}
int main(){
    ll n,m;
    scanf("%lld%lld",&n,&m);
    for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
    build(1,1,n);
    while(m--){
    	ll q,l,r,d;
    	scanf("%lld",&q);
    	if(q==1){
    		scanf("%lld%lld%lld",&l,&r,&d);
    		update(l,r,1,1,n,d);
		}
		else{
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",query(l,r,1,1,n));
		}
	}
    return 0;
}
悬一关

回复

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

正在加载回复...