mxqz线段树2分块,全WA
查看原帖
mxqz线段树2分块,全WA
366254
dxy2020楼主2022/9/17 13:11

rt,样例和数据一的第一个询问过了

#include <bits/stdc++.h>
#define int long long
using namespace std;
inline void in (int &x){
	int f=1;x=0;char c=getchar();
	while (c>'9'||c<'0'){if (c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9'){x=x*10+(c^48);c=getchar();}
	x*=f;
}
int bl,bn,n,m,op,p,x,y,k;
int a[100005],L[500],R[500],id[100005];
int sum[505],tag1[505],tag2[505];
inline void update1 (int l,int r,int k){
	if (id[l]==id[r]){
		for (int i=l;i<=r;++i){
			sum[id[i]]+=a[i]*(k-1);
			sum[id[i]]%=p;a[i]*=k;a[i]%=p;
		}
		return ;
	}
	for (int i=l;i<=R[id[l]];++i){
		sum[id[l]]+=a[i]*(k-1);
		sum[id[l]]%=p;a[i]*=k;a[i]%=p;
	}
	for (int i=r;i>=L[id[r]];--i){
		sum[id[r]]+=a[i]*(k-1);
		sum[id[r]]%=p;a[i]*=k;a[i]%=p;
	}
	for (int i=id[l]+1;i<=id[r]-1;++i){
		sum[i]*=k;sum[i]%=p; 
		tag1[i]*=k;tag1[i]%=p;
		tag2[i]*=k;tag2[i]%=p;
	}
}
inline void update2 (int l,int r,int k){
	if (id[l]==id[r]){
		for (int i=l;i<=r;++i){
			sum[id[i]]+=k;sum[id[i]]%=p;
			a[i]+=k;a[i]%=p;
		}
		return ;
	}
	for (int i=l;i<=R[id[l]];++i){
		sum[id[l]]+=k;sum[id[r]]%=p;
		a[i]+=k;a[i]%=p;
	}
	for (int i=r;i>=L[id[r]];--i){
		sum[id[r]]+=k;sum[id[r]]%=p;
		a[i]+=k;a[i]%=p;
	}
	for (int i=id[l]+1;i<=id[r]-1;++i){
		tag2[i]+=k;tag2[i]%=p;
		sum[i]+=bl*k;sum[i]%=p;
	}
}
inline int query (int l,int r){
	int ans=0; 
	if (id[l]==id[r]){
		for (int i=l;i<=r;++i){
			ans+=tag1[id[i]]*a[i]+tag2[id[i]];
			ans%=p;
		}
		return ans;
	}
	for (int i=l;i<=R[id[l]];++i){
		ans+=tag1[id[l]]*a[i]+tag2[id[l]];
		ans%=p;
	}
	for (int i=r;i>=L[id[r]];--i){
		ans+=tag1[id[r]]*a[i]+tag2[id[r]];
		ans%=p;
	}
	for (int i=id[l]+1;i<=id[r]-1;++i){
		ans+=sum[i];ans%=p; 
	}
	return ans;
}
signed main (){
	in (n);in (m);in (p);
	for (int i=1;i<=n;++i) in (a[i]);
	bl=(int) (sqrt (n)),bn=ceil (n*1./bl);
	for (int i=1;i<=n;++i)
		id[i]=(i-1)/bl+1;
	for (int i=1;i<=bn;++i){
		L[i]=(i-1)*bl+1;R[i]=i*bl;tag1[i]=1;
	}
	for (int i=1;i<=n;++i){
		sum[id[i]]+=a[i];
		sum[id[i]]%=p;
	}
	R[bn]=n;
	for (int i=1;i<=m;++i){
		in (op);in (x);in (y);
		if (op==1){in (k);update1 (x,y,k);}
		if (op==2){in (k);update2 (x,y,k);}
		if (op==3){printf ("%lld\n",query (x,y));} 
	}
	return 0;
}
2022/9/17 13:11
加载中...