七个点RE求调(用的分块)
查看原帖
七个点RE求调(用的分块)
1116724
Chitose_楼主2024/1/20 21:15
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int maxn=320;
int n,x,y,k,m,mod,t,opt,p,q;
int a[maxn*maxn],l[maxn],r[maxn],cheng[maxn],jia[maxn],pos[maxn],sum[maxn];
void updatecheng(int x,int y,int k){
	p=pos[x]; q=pos[y];
	if(p==q){
		sum[p]=0;
		for(int i=l[p];i<=r[p];i++){
			a[i]=(a[i]*cheng[p]+jia[p])%mod;
			if(i>=x && i<=y) a[i]=a[i]*k%mod;
			sum[p]=(sum[p]+a[i])%mod;
		}
		cheng[p]=1; jia[p]=0;
		return;
	}
	for(int i=p+1;i<=q-1;i++){
		sum[i]=sum[i]*k%mod;
		cheng[i]=cheng[i]*k%mod; jia[i]=jia[i]*k%mod;
	}
	sum[p]=0;
	for(int i=l[p];i<=r[p];i++){
		a[i]=(a[i]*cheng[p]+jia[p])%mod;
		if(i>=x) a[i]=a[i]*k%mod;
		sum[p]=(sum[p]+a[i])%mod;
	}
	cheng[p]=1; jia[p]=0;
	sum[q]=0;
	for(int i=l[q];i<=r[q];i++){
		a[i]=(a[i]*cheng[q]+jia[q])%mod;
		if(i<=y) a[i]=a[i]*k%mod;
		sum[q]=(sum[q]+a[i])%mod;
	}
	cheng[q]=1; jia[q]=0;
}
void updatejia(int x,int y,int k){
	p=pos[x]; q=pos[y];
	if(p==q){
		sum[p]=0;
		for(int i=l[p];i<=r[p];i++){
			a[i]=(a[i]*cheng[p]+jia[p])%mod;
			if(i>=x && i<=y) a[i]=(a[i]+k)%mod;
			sum[p]=(sum[p]+a[i])%mod;
		}
		cheng[p]=1; jia[p]=0;
		return;
	}
	for(int i=p+1;i<=q-1;i++){
		sum[i]=(sum[i]+(r[i]-l[i]+1)*k)%mod; jia[i]=(jia[i]+k)%mod;
	}
	sum[p]=0;
	for(int i=l[p];i<=r[p];i++){
		a[i]=(a[i]*cheng[p]+jia[p])%mod;
		if(i>=x) a[i]=(a[i]+k)%mod;
		sum[p]=(sum[p]+a[i])%mod;
	}
	cheng[p]=1; jia[p]=0;
	sum[q]=0;
	for(int i=l[q];i<=r[q];i++){
		a[i]=(a[i]*cheng[q]+jia[q])%mod;
		if(i<=y) a[i]=(a[i]+k)%mod;
		sum[q]=(sum[q]+a[i])%mod;
	}
	cheng[q]=1; jia[q]=0;
}
int query(int x,int y){
	int ans=0;
	p=pos[x]; q=pos[y];
	if(p==q){
		for(int i=x;i<=y;i++) ans=(ans+a[i]*cheng[p]+jia[p])%mod;
		return ans;
	}
	for(int i=p+1;i<=q-1;i++) ans=(ans+sum[i])%mod;
	for(int i=x;i<=r[p];i++) ans=(ans+a[i]*cheng[p]+jia[p])%mod;
	for(int i=l[q];i<=y;i++) ans=(ans+a[i]*cheng[q]+jia[q])%mod;
	return ans;
}
signed main(){
	freopen("1.in","r",stdin);
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	t=sqrt(n);
	for(int i=1;i<=t;i++){
		l[i]=t*(i-1)+1; r[i]=t*i;					
	}
	if(r[t]<n){
		t++; l[t]=r[t-1]+1; r[t]=n;
	}
	for(int i=1;i<=t;i++){
		for(int j=l[i];j<=r[i];j++){
			pos[j]=i; sum[i]=(sum[i]+a[j])%mod;
		}
	}
	for(int i=1;i<=t;i++){
		cheng[i]=1;
	}
	for(int o=1;o<=m;o++){
		scanf("%lld",&opt);
		if(opt==1){
			scanf("%lld%lld%lld",&x,&y,&k); updatecheng(x,y,k);
		}
		if(opt==2){
			scanf("%lld%lld%lld",&x,&y,&k); updatejia(x,y,k);
		}
		if(opt==3){
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(x,y));
		}
	}
	return 0;
}
2024/1/20 21:15
加载中...