30分,求调!!!
查看原帖
30分,求调!!!
570516
C9H10O楼主2023/7/7 21:45
#include <iostream>
using namespace std;
const int N=1e6+5;
long long s[N],tree[4*N+5],add[4*N+5],mul[4*N+5],ad=0,sum;
long long p;
void pushup(int num,int l,int r)
{
	add[num*2]+=add[num],add[num*2+1]+=add[num];
	mul[num*2]*=mul[num],mul[num*2+1]*=mul[num];
	tree[num]+=(r-l+1)*add[num],add[num]=0;
	tree[num]*=mul[num],mul[num]=1;
	tree[num]%=p;
	add[num*2]%=p,add[num*2+1]%=p;
	mul[num*2]%=p,mul[num*2+1]%=p;
	return ;
}
void push(int num,int l,int r)
{
	int mid=l+r>>1;
	pushup(num*2,l,mid),pushup(num*2+1,mid+1,r);
	pushup(num,l,r);
	return ;
}
void build(int l,int r,int num)
{
	mul[num]=1;
	if(l==r)
	{
		tree[num]=s[l];
		return ;
	}	
	int mid=(l+r)/2;
	build(l,mid,num*2);
	build(mid+1,r,num*2+1);
	tree[num]=tree[num*2]+tree[num*2+1];
	return ;
}
long long cheng(int l,int r,int num,int tl,int tr,int m)
{
	long long sum=0;
	push(num,l,r);
	int mid=l+r>>1;
	if(l==tl&&r==tr)
	{
		long long ad=tree[num];
		mul[num]*=m;
		push(num,l,r);
		return ad*(m-1);
	}
	if(tl<=mid)//左边
		sum+=cheng(l,mid,num*2,tl,min(mid,tr),m);
	if(tr>=mid+1)//右边
		sum+=cheng(mid+1,r,num*2+1,max(mid+1,tl),tr,m);
	tree[num]+=sum;
	tree[num]%=p;
	return sum%p;	
}
void adding(int l,int r,int num,int tl,int tr,int m)
{
	push(num,l,r);
	int mid=l+r>>1;
	if(l==tl&&r==tr)
	{
		add[num]+=m;
		push(num,l,r);
		return ;
	}
	if(tl<=mid)//左边
		adding(l,mid,num*2,tl,min(mid,tr),m);
	if(tr>=mid+1)//右边
		adding(mid+1,r,num*2+1,max(mid+1,tl),tr,m);
	tree[num]+=(tr-tl+1)*m;
	tree[num]%=p;
	return ;	
}
long long getans(int l,int r,int num,int tl,int tr)
{
	long long sum=0;
	push(num,l,r);
	if(l==tl&&r==tr)
	{
		tree[num]%=p;
		return tree[num];
	}	
	int mid=l+r>>1;
	if(tl<=mid)//左边
		sum+=getans(l,mid,num*2,tl,min(mid,tr));
	if(tr>=mid+1)//右边
		sum+=getans(mid+1,r,num*2+1,max(mid+1,tl),tr);
	return sum%p;
}
int main()
{
	int n,m,c,x,y,k;
	cin>>n>>m>>p;
	for(int i=1;i<=n;++i)
		cin>>s[i];
	build(1,n,1);
	while(m--)
	{
		cin>>c>>x>>y;
		if(c==1)
		{
			cin>>k;
			cheng(1,n,1,x,y,k);
		}
		else if(c==2)
		{
			cin>>k;
			adding(1,n,1,x,y,k);
		}
		else
			cout<<getans(1,n,1,x,y)%p<<endl;
	}
 } 

我也不知道哪里有问题。
绝望

2023/7/7 21:45
加载中...