分块求助,得了60分,WA 2,7,8,9,10
查看原帖
分块求助,得了60分,WA 2,7,8,9,10
371278
herselfqwq楼主2021/4/9 20:01

RT,感觉可能爆long long 了,但是查不出来错,感谢各位点进来的大佬

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int Max_N=100005;
ll n,m,mod,belong[Max_N],l[Max_N],r[Max_N];
ll block,num,add[Max_N],mul[Max_N],sum[Max_N],a[Max_N];
inline void down (int p) {
	for (register int i=l[p];i<=r[p];i++) {
		a[i]*=mul[p],a[i]+=add[p],a[i]%=mod;
	}
	sum[p]%=mod;
	mul[p]=1,add[p]=0;
	return ;
}
inline void build () {
	block=sqrt(n);
	num=n/block;
	if (n%block) num++;
	for (register int i=1;i<=n;i++) {
		belong[i]=(i-1)/block+1;
		sum[belong[i]]+=a[i];
	} 
	for (register int i=1;i<=num;i++) {
		l[i]=(i-1)*block+1;
		r[i]=i*block;
		mul[i]=1;
		sum[belong[i]]%=mod;
	}
	r[num]=n;
	return ;
}
inline void Mul (int x,int y,int c) {
	if (belong[x]==belong[y]) {
		down(belong[x]);
		for (register int i=x;i<=y;i++) {
			sum[belong[i]]+=(c-1)*a[i]%mod;
			a[i]*=c;
		}
		return ;
	}else{
		down(belong[x]);
		down(belong[y]);
		for (register int i=x;i<=r[belong[x]];i++) {
			sum[belong[i]]+=(c-1)*a[i]%mod;
			a[i]*=c;
		}
		for (register int i=belong[x]+1;i<belong[y];i++) {
			mul[i]*=c,mul[i]%=mod;
			add[i]*=c,add[i]%=mod;
			sum[i]*=c,sum[i]%=mod;
		}
		for (register int i=l[belong[y]];i<=y;i++) {
			sum[belong[i]]+=(c-1)*a[i]%mod;
			a[i]*=c;
		}
		return ;
	}
}
inline void Add (int x,int y,int c) {
	if (belong[x]==belong[y]) {
		down(belong[x]);
		sum[belong[x]]+=(y-x+1)*c%mod;
		sum[belong[x]]%=mod;
		for (register int i=x;i<=y;i++) {
			a[i]+=c;
		}
		return ;
	}else{
		down(belong[x]);
		down(belong[y]);
		sum[belong[x]]+=(r[belong[x]]-x+1)*c%mod;
		sum[belong[x]]%=mod;
		for (register int i=x;i<=r[belong[x]];i++) {
			a[i]+=c;
		}
		for (register int i=belong[x]+1;i<belong[y];i++) {
			add[i]+=c,add[i]%=mod;
			sum[i]+=block*c,sum[i]%=mod;
		}
		sum[belong[y]]+=(y-l[belong[y]]+1)*c%mod;
		sum[belong[y]]%=mod;
		for (register int i=l[belong[y]];i<=y;i++) {
			a[i]+=c;
		}
		return ;
	}
}
inline void query (int x,int y) {
	ll ans=0;
	if (belong[x]==belong[y]) {
		for (register int i=x;i<=y;i++) {
			ans+=a[i]*mul[belong[i]]%mod+add[belong[i]];
			ans%=mod;
		}
		cout<<ans<<'\n';
		return ;
	}else{
		for (register int i=x;i<=r[belong[x]];i++) {
			ans+=a[i]*mul[belong[i]]+add[belong[i]];
			ans%=mod;
		}
		for (register int i=belong[x]+1;i<belong[y];i++) {
			ans+=sum[i];
			ans%=mod;
		}
		for (register int i=l[belong[y]];i<=y;i++) {
			ans+=a[i]*mul[belong[i]]+add[belong[i]];
			ans%=mod;
		}
		cout<<ans<<'\n';
		return ;
	}
}
signed main () {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>mod;
	for (register int i=1;i<=n;i++) {
		cin>>a[i];
	}
	build();
	cin>>m;
	while (m--) {
		int op,t,g,c;
		cin>>op>>t>>g;
		if (op==1) {
			cin>>c;
			Mul(t,g,c);
		}
		if (op==2) {
			cin>>c;
			Add(t,g,c);
		}
		if (op==3) {
			query(t,g);
		}
	}
}
2021/4/9 20:01
加载中...