社区讨论

蒟蒻70pts3个点WA求调,玄关

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@lwbtlinv
此快照首次捕获于
2024/05/18 16:02
2 年前
此快照最后确认于
2024/05/18 18:23
2 年前
查看原帖
代码:
C
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=100005;
ll n,m;
ll a[N],tree[N*4],tag[N*4];
void build(ll p,ll pl,ll pr){
	tag[p]=0;
	if(pl==pr){
		tree[p]=a[pl];
		return;
	}
	ll mid=(pl+pr)/2;
	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 k){
	tag[p]+=k;
	tree[p]+=k*(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 k){
	if(pl>=l && pr<=r){
		addtag(p,pl,pr,k);
		return;
	}
	push_down(p,pl,pr);
	ll mid=(pl+pr)>>1;
	if(l<=mid)update(l,r,p<<1,pl,mid,k);
	if(r>=mid+1)update(l,r,p<<1|1,mid+1,pr,k);
	tree[p]=tree[p<<1]+tree[p<<1|1];
}
int query(ll l,ll r,ll p,ll pl,ll pr){
	if(pl>=l && pr<=r)return tree[p];
	push_down(p,pl,pr);
	ll ans=0;
	ll mid=(pl+pr)>>1;
	if(l<=mid)ans+=query(l,r,p<<1,pl,mid);
	if(r>=mid+1)ans+=query(l,r,p<<1|1,mid+1,pr);
	return ans;
}
int main(){
	cin>>n>>m;
	for(ll i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	ll z,x,y,k;
	for(ll i=1;i<=m;i++){
		cin>>z;
		if(z==1){
			cin>>x>>y>>k;
			update(x,y,1,1,n,k);
		}else{
			cin>>x>>y;
			cout<<query(x,y,1,1,n)<<endl;
		}
	}
	return 0;
} 

回复

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

正在加载回复...