蒟蒻被自己弱死了
查看原帖
蒟蒻被自己弱死了
238015
改名但没卡67楼主2021/7/17 16:54

分块打的这道题,恒输出零,感觉不大透彻,求大佬调一调(马蜂丑请见谅)

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int kM=100010;
const int kN=1010;
int n,bl[kN],L[kN],R[kN],sum[kN];
int lazy1[kN],lazy2[kN];
int a[kM];
int p,m;
void add(int l,int r,int c)
{
	if(bl[l]==bl[r])
	{
		for(int i=l;i<=r;i++)
		{
			a[i]+=c;
			a[i]%=p;
			sum[bl[i]]+=c;
			sum[bl[i]]%=p;
		}
	}
	else
	{
		int pos1=R[bl[l]],pos2=L[bl[r]];
		for(int i=l;i<=pos1;i++)
		{
			a[i]+=c;
			a[i]%=p;
			sum[bl[i]]+=c;
			sum[bl[i]]%=p;
		}
		for(int i=pos2;i<=r;i++)
		{
			a[i]+=c;
			a[i]%=p;
			sum[bl[i]]+=c;
			sum[bl[i]]%=p;
		}
		for(int i=bl[l]+1;i<=bl[r]-1;i++)
		{
			lazy1[i]+=c;
		}
	}
}
void cheng(int l,int r,int c)
{
	if(bl[l]==bl[r])
	{
		for(int i=l;i<=r;i++)
		{
			sum[bl[i]]-=a[i];
			a[i]%=p;
			sum[bl[i]]%=p;
			a[i]*=c;
			a[i]%=p;
			sum[bl[i]]%=p;
			sum[bl[i]]+=a[i];
			a[i]%=p;
			sum[bl[i]]%=p;
		}
	}
	else
	{
		int pos1=R[bl[l]],pos2=L[bl[r]];
		for(int i=l;i<=pos1;i++)
		{
			sum[bl[i]]-=a[i];
			a[i]%=p;
			sum[bl[i]]%=p;
			a[i]*=c;
			a[i]%=p;
			sum[bl[i]]%=p;
			sum[bl[i]]+=a[i];
			a[i]%=p;
			sum[bl[i]]%=p;
		}
		for(int i=pos2;i<=r;i++)
		{
			sum[bl[i]]-=a[i];
			a[i]%=p;
			sum[bl[i]]%=p;
			a[i]*=c;
			a[i]%=p;
			sum[bl[i]]%=p;
			sum[bl[i]]+=a[i];
			a[i]%=p;
			sum[bl[i]]%=p;
		}
		for(int i=bl[l]+1;i<=bl[r]-1;i++)
		{
			lazy2[i]*=c;
			lazy1[i]*=c;
		}
	}
}
int ask(int l,int r)
{
	int ans=0;
	if(bl[l]==bl[r])
	{
		int ps=bl[l];
		for(int i=l;i<=r;i++)
		{
			ans+=((a[i]*lazy2[ps])+lazy1[ps])%p;
			ans%=p;
		}
	}
	else
	{
		int pos1=R[bl[l]],pos2=L[bl[r]];
		int ps1=bl[l],ps2=bl[r];
		for(int i=l;i<=pos1;i++)
		{
			ans+=((a[i]*lazy2[ps1])+lazy1[ps1])%p;
			ans%=p;
		}
		for(int i=pos2;i<=r;i++)
		{
			ans+=((a[i]*lazy2[ps2])+lazy1[ps2])%p;
			ans%=p;
		}
		for(int i=bl[l]+1;i<=bl[r]-1;i++)
		{
			ans+=((sum[i]*lazy2[i])+lazy1[i]*(R[i]-L[i]+1))%p;
			ans%=p;
		}
	}
}
int main()
{
	scanf("%d%d",&n,&p);
	int len=sqrt(n);
	L[1]=1;
	int last=1;;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		bl[i]=(i-1)/len+1;
		if(last!=bl[i])
		{
			L[bl[i]]=i;
			R[bl[i]-1]=i-1;
		}
		sum[bl[i]]+=a[i];
		last=bl[i];
	}
	R[bl[n]]=n;
	int t,g,c,opt;
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		cin>>opt;
		if(opt==1)
		{
			scanf("%d%d%d",&t,&g,&c);
			cheng(t,g,c);
		}
		if(opt==2)
		{
			scanf("%d%d%d",&t,&g,&c);
			add(t,g,c);
		}
		if(opt==3)
		{
			scanf("%d%d",&t,&g);
			printf("%d\n",ask(t,g)%p);
		}
	}
	return 0;
}
2021/7/17 16:54
加载中...