70pts求助!!!老师都不知道咋回事
查看原帖
70pts求助!!!老师都不知道咋回事
964645
pies_0x楼主2024/1/23 12:15

提交记录

在老师的指导下,我的码风渐渐失控(39-42行)

#include<bits/stdc++.h>
using namespace std;

#define N 100005

long long n,q,m,a[N],sum[N*4],add[N*4],mul[N*4];

void build(int k,int l,int r)
{
	mul[k]=1;
	if(l==r)
	{
		sum[k]=a[l]%m;
		return;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	sum[k]=(sum[k*2]%m+sum[k*2+1]%m)%m;
}

void adds(int k,int l,int r,int v)
{
	sum[k]=(sum[k]%m+(r-l+1)*v%m)%m;
	add[k]=(add[k]%m+v%m)%m;
}

void muls(int k,int l,int r,int v)
{
	sum[k]=(sum[k]*v)%m;
	/*if((mul[k]*v)%m!=0)*/mul[k]=(mul[k]*v)%m;
	add[k]=(add[k]*v)%m;
}

void down(int k,int l,int r)
{
	if(add[k]==0&&mul[k]==1)return;
	int mid=(l+r)/2;
	
	
	
	//adds(k*2+1,mid+1,r,add[k]);adds(k*2,l,mid,add[k]);
	muls(k*2,l,mid,mul[k]);
	muls(k*2+1,mid+1,r,mul[k]);mul[k]=1;adds(k*2+1,mid+1,r,add[k]);adds(k*2,l,mid,add[k]);
	add[k]=0;
	
}
void Add_modify(int k,int l,int r,int x,int y,int v)
{
	if(x>r||y<l)return;
	if(x<=l&&y>=r)
	{
		adds(k,l,r,v);
		return;
	}
	down(k,l,r);
	int mid=(l+r)/2;
	Add_modify(k*2,l,mid,x,y,v);
	Add_modify(k*2+1,mid+1,r,x,y,v);
	sum[k]=(sum[k*2]%m+sum[k*2+1]%m)%m;
}

void Mul_modify(int k,int l,int r,int x,int y,int v)
{
	if(x>r||y<l)return;
	if(x<=l&&y>=r)
	{
		muls(k,l,r,v);
		return;
	}
	down(k,l,r);
	int mid=(l+r)/2;
	Mul_modify(k*2,l,mid,x,y,v);
	Mul_modify(k*2+1,mid+1,r,x,y,v);
	sum[k]=(sum[k*2]%m+sum[k*2+1]%m)%m;
}

long long query(int k,int l,int r,int x,int y)
{
	if(x>r||y<l)return 0;
	if(x<=l&&y>=r)return sum[k]%m;
	down(k,l,r);
	int mid=(l+r)/2;
	return (query(k*2,l,mid,x,y)%m+query(k*2+1,mid+1,r,x,y)%m)%m;
}

int main()
{
	scanf("%lld%lld%lld",&n,&q,&m);
	for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
	build(1,1,n);
	while(q--)
	{
		int t;
		scanf("%d",&t);
		if(t==2)
		{
			int l,r,v;
			scanf("%d%d%d",&l,&r,&v);
			Add_modify(1,1,n,l,r,v%m);
		}
		else if(t==3)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(1,1,n,x,y));
		}
		else
		{
			int l,r,v;
			scanf("%d%d%d",&l,&r,&v);
			Mul_modify(1,1,n,l,r,v);
		}
	}
	return 0;
}

感觉问题像31行取余会有0

2024/1/23 12:15
加载中...