分块求助
查看原帖
分块求助
399250
AffineRing楼主2021/2/7 09:54

首先样例是过的,但是就是全WA

下了个数据,第一个点的数据就太大了手算算不了……

但是我真的查了古生物化石遍了都没有查出错误……

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read(){
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
ll n,blo,m,mod;
ll v[100005],bl[100005],atag[1005],mtag[1005],sum[1005];
void reset(ll x){
	for(ll i=(x-1)*blo+1;i<=min(n,x*blo);i++)
		v[i]=(v[i]*mtag[x]+atag[x])%mod;
	atag[x]=0,mtag[x]=1;
}
void solve(ll f,ll a,ll b,ll c){
	reset(bl[a]);
	for(ll i=a;i<=min(bl[a]*blo,b);i++){
		if(f==2)v[i]+=c;
		else v[i]*=c;
		v[i]%=mod;
	}
	if(bl[a]!=bl[b]){
		reset(bl[b]);
		for(ll i=(bl[b]-1)*blo+1;i<=b;i++){
			if(f==2)v[i]+=c;
			else v[i]*=c;
			v[i]%=mod;
		}
	}
	for(ll i=bl[a]+1;i<=bl[b]-1;i++)
		if(f==2)atag[i]=(atag[i]+c)%mod;
		else atag[i]=(atag[i]*c)%mod,mtag[i]=(mtag[i]*c)%mod;
	ll s=0;
	for(ll i=(bl[a]-1)*blo+1;i<=min(n,bl[a]*blo);i++)s+=v[i];
	sum[bl[a]]=s,s=0;
	for(ll i=(bl[b]-1)*blo+1;i<=min(n,bl[b]*blo);i++)s+=v[i];
	sum[bl[b]]=s;
}
ll ask(ll a,ll b){
	ll ans=0;
	for(ll i=a;i<=min(bl[a]*blo,b);i++)
		ans+=v[i]*mtag[bl[i]]+atag[bl[a]];
	if(bl[a]!=bl[b])
		for(ll i=(bl[b]-1)*blo+1;i<=b;i++)
			ans+=v[i]*mtag[bl[i]]+atag[bl[b]];
	for(ll i=bl[a]+1;i<=bl[b]-1;i++)
		ans+=sum[bl[i]]*mtag[bl[i]]+blo*atag[bl[i]];
	return ans;
}
int main(){
	n=read(),m=read(),mod=read(),blo=sqrt(n);
	for(ll i=1;i<=n;i++)v[i]=read();
	for(ll i=1;i<=n;i++)bl[i]=(i-1)/blo+1,sum[bl[i]]+=v[i];
	for(ll i=1;i<=bl[n];i++)mtag[i]=1;		
	for(ll i=1;i<=m;i++){
		ll f=read();
		if(f==3){
			ll a=read(),b=read();
			printf("%d\n",ask(a,b)%mod);
		}
		else{
			ll a=read(),b=read(),c=read();
			solve(f,a,b,c);
		}
	}
	return 0;
}
2021/2/7 09:54
加载中...