社区讨论

怎么的就进入了死循环了?

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

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@m00ont9h
此快照首次捕获于
2024/08/19 15:37
2 年前
此快照最后确认于
2024/08/19 17:14
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5;
ll n,m;
ll a[N],tr[N<<2],tag[N<<2];
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
void f(ll p,ll l,ll r,ll k)
{
	tr[p]+=(r-l+1)*k;
	tag[p]+=k;
}
void push_up(ll p)
{
	tr[p]=tr[ls(p)]+tr[rs(p)];	
}
void push_down(ll p,ll l,ll r)
{
	ll mid=(l+r)>>1;
	f(ls(p),l,mid,tag[p]);
	f(rs(p),mid+1,r,tag[p]);
	tag[p]=0;
}
void build(ll p,ll l,ll r)
{
	if(l==r)
	{
		tr[p]=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}
void update(ll nl,ll nr,ll k,ll p,ll l,ll r)
{
	if(nl<=l&&r<=nr)
	{
		tr[p]+=(r-l+1)*k;
		tag[p]+=k;
		return;
	}
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(nl<=mid) 
		update(nl,nr,k,ls(p),l,mid);
	if(mid+1<=nr)
		update(nl,nr,k,rs(p),mid+1,r);
	push_up(p);
}
ll query(ll nl,ll nr,ll p,ll l,ll r)
{
	if(nl<=l&&r<=nr) return tr[p];
	ll res=0,mid=(l+r)>>1;
	push_down(p,l,r);
	if(nl<=mid)
		res+=query(nl,nr,ls(p),l,mid);
	if(mid+1<=r)
		res+=query(nl,nr,rs(p),mid+1,r);
	return res;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) 
		scanf("%lld",&a[i]);
	build(1,1,n);
	while(m--)
	{
		ll p;
		scanf("%lld",&p);
		if(p==1){
			ll nl,nr,k;
			scanf("%lld%lld%lld",&nl,&nr,&k);
			update(nl,nr,k,1,1,n);
		}
		if(p==2){
			ll l,r;
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",query(l,r,1,1,n));
		}
	}
	
	return 0;
}

回复

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

正在加载回复...