60,RE,求助!!
查看原帖
60,RE,求助!!
542879
_HCl_楼主2022/2/3 23:49

此代码在线段树2上可以AC,但在此题中#2,#8,#9,#10号点都RE

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[10000001];
int P;
struct treeNode{
	int l,r;
	long long num,ad,ml;
};
treeNode t[10000001];
void buildTree(int p,int l,int r)
{
	t[p].l=l;
	t[p].r=r;
	t[p].ml=1;
	if(l==r)
	{
		t[p].num=a[l]%P;
		return;
	}
	int mid=(l+r)>>1;
	buildTree(p*2,l,mid);
	buildTree(p*2+1,mid+1,r);
	t[p].num=(t[p*2].num+t[p*2+1].num)%P;
}
void pushDown(int p)
{
	long long add=t[p].ad;
	long long mul=t[p].ml;
	t[p*2].num=(t[p*2].num*mul+add*(t[p*2].r-t[p*2].l+1))%P;
	t[p*2+1].num=(t[p*2+1].num*mul+add*(t[p*2+1].r-t[p*2+1].l+1))%P;
	t[p*2].ml=t[p*2].ml*mul%P;
	t[p*2+1].ml=t[p*2+1].ml*mul%P;
	t[p*2].ad=(t[p*2].ad*mul+add)%P;
	t[p*2+1].ad=(t[p*2+1].ad*mul+add)%P;
	t[p].ad=0;
	t[p].ml=1;
}
void add(int p,int l,int r,int k)
{
	if(l<=t[p].l&&r>=t[p].r)
	{
		t[p].num+=(long long)k*(t[p].r-t[p].l+1);
		t[p].ad+=k;
		t[p].num%=P;
		t[P].ad%=P;
		return;
	}
	pushDown(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)
	{
		add(p*2,l,r,k);
	}
	if(r>mid)
	{
		add(p*2+1,l,r,k);
	}
	t[p].num=t[p*2].num+t[p*2+1].num;
}
void mul(int p,int l,int r,int k)
{
	if(l<=t[p].l&&r>=t[p].r)
	{
		t[p].num*=k;
		t[p].num%=P;
		t[p].ml*=k;
		t[p].ad*=k;
		return;
	}
	pushDown(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)
	{
		mul(p*2,l,r,k);
	}
	if(r>mid)
	{
		mul(p*2+1,l,r,k);
	}
	t[p].num=t[p*2].num+t[p*2+1].num;
}
long long getSum(int p,int l,int r)
{
	if(l<=t[p].l&&r>=t[p].r)
	{
		return t[p].num%P;
	}
	pushDown(p);
	int mid=(t[p].l+t[p].r)>>1;
	long long _now=0;
	if(l<=mid)
	{
		_now+=getSum(p*2,l,r);
	}
	if(r>mid)
	{
		_now+=getSum(p*2+1,l,r);
	}
	return _now%P;
}
int main()
{
	cin>>n>>P;
	for(int i=1;i<=n;++i)
	{
		cin>>a[i];
	}
	buildTree(1,1,n);
	cin>>m;
	for(int i=1;i<=m;++i)
	{
		int op,x,y,z;
		cin>>op;
		if(op==2)
		{
			cin>>x>>y>>z;
			add(1,x,y,z);
		}
		else if(op==1)
		{
			cin>>x>>y>>z;
			mul(1,x,y,z);
		}
		else
		{
			cin>>x>>y;
			cout<<getSum(1,x,y)<<endl;
		}
	}
 } 
2022/2/3 23:49
加载中...