样例过了,0分求调
查看原帖
样例过了,0分求调
670369
Haowei1527楼主2023/8/10 17:21
#include<bits/stdc++.h>
using namespace std;
int n,q,m;
long long sum[400010],ll[400010],rr[400010],t1[400010],t2[400010];
long long a[100010];
void build(int p,int l,int r)
{
	ll[p]=l,rr[p]=r;
	if(l==r)
	{
		sum[p]=a[l]%m;
		ll[p]=l;
		rr[p]=r; 
		return;
	}
	else
	{
		int mid=(l+r)/2;
		build(2*p,l,mid),build(2*p+1,mid+1,r);
		sum[p]=sum[2*p]+sum[2*p+1];
		sum[p]%=m;
	}
}
void down(int p,int g)
{
	if(g==1)
	{
		t1[2*p]*=t1[p]%m;
		t1[2*p]%=m;
		sum[2*p]*=t1[p]%m;
		t1[2*p+1]*=t1[p]%m;
		t1[2*p+1]%=m;
		sum[2*p+1]*=t1[p]%m;
		t2[2*p]*=t1[p]%m;
		t2[2*p+1]*=t1[p]%m;
		t1[p]=1;
	}
	if(g==2)
	{
		t2[2*p]+=t2[p]%m;
		t2[2*p]%=m;
		sum[2*p]+=(rr[2*p]-ll[2*p]+1)*t2[p]%m;
		sum[2*p]%=m;
		t2[2*p+1]+=t2[p]%m;
		t2[2*p+1]%=m;
		sum[2*p+1]+=(rr[2*p+1]-ll[2*p+1]+1)*t2[p]%m;
		sum[2*p+1]%=m;
		t2[p]=0;
	}
}
long long ask(int p,int l,int r)
{
	long long s=0;
	if(ll[p]>=l&&rr[p]<=r)
	{
		return sum[p];
	}
	else
	{
		if(t1[p]>1) down(p,1);
		if(t2[p]>0) down(p,2);
		int mid=(ll[p]+rr[p])/2;
		if(mid>=l) s+=ask(2*p,l,r)%m;
		if(mid+1<=r) s+=ask(2*p+1,l,r)%m;
	}
	return s%m;
}
void update(int p,int l,int r,int c,int g)
{
	if(ll[p]>=l&&rr[p]<=r)
	{
		if(g==1)
		{
			sum[p]*=c%m;
			sum[p]%=m;
			t1[p]*=c%m;
			t2[p]*=c%m;
		}
		if(g==2)
		{
			if(t1[p]>1)down(p,1);
			sum[p]+=(rr[p]-ll[p]+1)*c%m;
			t2[p]+=c;
		}
		return;
	}
	else
	{
		if(t1[p]>1) down(p,1);
		if(t2[p]>0) down(p,2);
		int mid=(ll[p]+rr[p])/2;
		if(mid>=l) update(2*p,l,r,c,g);
		if(mid+1<=r) update(2*p+1,l,r,c,g);
		sum[p]=(sum[2*p]+sum[2*p+1])%m;
		sum[p]%=m;
	}
}
int main()
{
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	int g,l,r,x;
	build(1,1,n);
	for(int i=1;i<=q;i++)
	{
		cin>>g;
		if(g==1){
			cin>>l>>r>>x;
			update(1,l,r,x,1);
		}
		if(g==2){
			cin>>l>>r>>x;
			update(1,l,r,x,2);
		}
		if(g==3){
			cin>>l>>r;
			cout<<ask(1,l,r)<<endl;
		}
	}
	return 0;
}

样例能过,但是0分,请问如何修改?

2023/8/10 17:21
加载中...