求助大佬们 调好久了 样例都没过。。。
查看原帖
求助大佬们 调好久了 样例都没过。。。
150467
never_turn_right楼主2021/2/3 16:57

Rt 好像是每次输出的时候都不会下传标记 其它时候没问题

#include<iostream>
using namespace std;
int n,m,p,s[400001],lazyTagPlus[400001],lazyTagMu[400001],ysz[100001];
void pushDown(int k,int l,int r,int mid)
{
	s[k*2]=(s[k*2]*lazyTagMu[k]+lazyTagPlus[k]*(mid-l+1))%p;
	s[k*2+1]=(s[k*2+1]*lazyTagMu[k]+lazyTagPlus[k]*(r-mid))%p;
	lazyTagMu[k*2]=(lazyTagMu[k]*lazyTagMu[k*2])%p;
	lazyTagMu[k*2+1]=(lazyTagMu[k]*lazyTagMu[k*2+1])%p;
	lazyTagPlus[k*2]=(lazyTagPlus[k*2]*lazyTagMu[k]+lazyTagPlus[k])%p;
	lazyTagPlus[k*2+1]=(lazyTagPlus[k*2+1]*lazyTagMu[k]+lazyTagPlus[k])%p;
	lazyTagMu[k]=1;
	lazyTagPlus[k]=0;
}
void build(int k,int l,int r)
{
	if(l==r) 
	{
		s[k]=ysz[l];return;	
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	s[k]=s[k*2]+s[k*2+1];
	s[k]%=p;
}
void changePlus(int k,int l,int r,int x,int y,int v)
{
	if(l>=x&&r<=y) 
	{
		lazyTagPlus[k]=(lazyTagPlus[k]+v)%p;
		s[k]=(s[k]+v*(r-l+1))%p;
		return;
	}
	int mid=(l+r)/2;
	pushDown(k,l,r,mid);
	if(x<=mid) changePlus(k*2,l,mid,x,y,v);
	if(y>mid) changePlus(k*2+1,mid+1,r,x,y,v);
	s[k]=(s[k*2]+s[k*2+1])%p;
}
void changeMu(int k,int l,int r,int x,int y,int v)
{
	if(l>=x&&r<=y) 
	{
		lazyTagPlus[k] = (lazyTagPlus[k] * v) % p;
		lazyTagMu[k] = (lazyTagMu[k] * v) % p;
		s[k] = (s[k] * v) % p;
		return;
	} 
	int mid=(l+r)/2,res=0;
	pushDown(k,l,r,mid);
	if(x<=mid) changeMu(k*2,l,mid,x,y,v);
	if(y>mid) changeMu(k*2+1,mid+1,r,x,y,v);
	s[k]=(s[k*2]+s[k*2+1])%p;
}
int qHe(int k,int l,int r,int x,int y)
{
	if(l>=x&&r<=y) return s[k];
	int mid=(l+r)/2,res=0;
	pushDown(k,l,r,mid);
	if(x<=mid) res+=qHe(k,l,mid,x,y);
	if(y>mid) res+=qHe(k,mid+1,r,x,y);
	res%=p;
	return res;
}
int main()
{
	for(int i=1;i<=400000;i++)	lazyTagMu[i]=1;
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)
		cin>>ysz[i];
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int pa;
		cin>>pa;
		if(pa==1) 
		{
			int xx,yy,kv;
			cin>>xx>>yy>>kv;
			changeMu(1,1,n,xx,yy,kv);
		}
		if(pa==2) 
		{
			int xx,yy,kv;
			cin>>xx>>yy>>kv;
			changePlus(1,1,n,xx,yy,kv);
		}
		if(pa==3)
		{
			int xx,yy;
			cin>>xx>>yy;
			cout<<qHe(1,1,n,xx,yy)%p<<endl;
		}
		
		/*for(int i=1;i<=9;i++)
			cout<<s[i]<<" ";cout<<endl;
		for(int i=1;i<=9;i++)
			cout<<lazyTagMu[i]<<" ";cout<<endl;
		for(int i=1;i<=9;i++)
			cout<<lazyTagPlus[i]<<" ";
		cout<<endl;*/
	}
	return 0;
}
2021/2/3 16:57
加载中...