SOS
  • 板块灌水区
  • 楼主Three_bodyIII
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/9/30 08:29
  • 上次更新2023/11/2 17:03:38
查看原帖
SOS
928270
Three_bodyIII楼主2023/9/30 08:29
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+1,inf=-2e18;
int n,m,i,gai[N],add[N],a[N],sum[N],x,y,z;
void Build(int l,int r,int rt){
	if(l==r){
		sum[rt]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	Build(l,mid,rt*2);
	Build(mid+1,r,rt*2+1);
	sum[rt]=sum[rt*2]+sum[rt*2+1];
	return ;
}
void PushDown(int rt,int ls,int rs){
	add[rt*2]+=add[rt];
	add[rt*2+1]+=add[rt];
	sum[rt*2]+=add[rt]*ls;
	sum[rt*2+1]+=add[rt]*rs;
	add[rt]=0;
	return ;
}
void XgDown(int rt,int ls,int rs){
	gai[rt*2]=gai[rt];
	gai[rt*2+1]=gai[rt];
	sum[rt*2]=gai[rt]*ls;
	sum[rt*2]=gai[rt]*ls;
	gai[rt]=inf;
}
int Query(int l,int r,int L,int R,int rt){
	if(l<=L&&R<=r)	return sum[rt];
	int mid=(L+R)>>1;
	if(gai[rt]!=inf) XgDown(rt,mid-L+1,R-mid);
	if(gai[rt]==inf&&add[rt])	PushDown(rt,mid-L+1,R-mid);
	if(r<=mid)	return Query(l,r,L,mid,rt*2);
	else if(l>=mid+1)	return Query(l,r,mid+1,R,rt*2+1);
	else	return Query(l,mid,L,mid,rt*2)+Query(mid+1,r,mid+1,R,rt*2+1);
}
void Update(int l,int r,int s,int L,int R,int rt){
	if(l<=L&&R<=r){
		sum[rt]+=(r-l+1)*s;
		if(gai[rt]!=inf)	gai[rt]+=s;
		else	add[rt]+=s;
		return ;
	}
	int mid=(L+R)>>1;
	if(gai[rt]!=inf) XgDown(rt,mid-L+1,R-mid);
	if(gai[rt]==inf&&add[rt])	PushDown(rt,mid-L+1,R-mid);
	if(r<=mid)	Update(l,r,s,L,mid,rt*2);
	else if(l>mid)	Update(l,r,s,mid+1,R,rt*2+1);
	else Update(l,mid,s,L,mid,rt*2),Update(mid+1,r,s,mid+1,R,rt*2+1);
	sum[rt]=sum[rt*2]+sum[rt*2+1];
	return ;
}
void Xgdate(int l,int r,int s,int L,int R,int rt){
	if(l<=L&&R<=r){
		sum[rt]+=(r-l+1)*s;
		add[rt]+=s;
		return ;
	}
	int mid=(L+R)>>1;
	if(gai[rt]!=inf) XgDown(rt,mid-L+1,R-mid);
	if(gai[rt]==inf&&add[rt])	PushDown(rt,mid-L+1,R-mid);	
	if(r<=mid)	Update(l,r,s,L,mid,rt*2);
	else if(l>mid)	Update(l,r,s,mid+1,R,rt*2+1);
	else Update(l,mid,s,L,mid,rt*2),Update(mid+1,r,s,mid+1,R,rt*2+1);
	sum[rt]=sum[rt*2]+sum[rt*2+1];
	return ;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(i=1;i<=n;i++)	cin>>a[i],gai[i]=inf;
	Build(1,n,1);
	while(m--){
		int ch;
		cin>>ch;
		if(ch==1){
			cin>>x>>y>>z;
			Update(x,y,z,1,n,1); 
		}
		else if(ch==2){
			cin>>x>>y>>z;
			Xgdate(x,y,z,1,n,1);
		}
		else{
			cin>>x>>y;
			cout<<Query(x,y,1,n,1)<<"\n";			
		}
	}
	return 0;
}

P1253 那错了?(样例没过)

2023/9/30 08:29
加载中...