30分,线段树模板2 求助
查看原帖
30分,线段树模板2 求助
109220
Farkas_W楼主2020/8/5 20:08
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define ll long long
using namespace std;
inline int read()
{
	int x=0,f=1;char c;c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-f;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+(c-'0');
		c=getchar();
	}
	return x*f;
}
const int N=5e5+10;
ll sum[N*8],add[N],mul[N*8],n,m,p,a[N];
void build(int k,int l,int r)//建树 
{
	if(l==r)
	{
		int x=0;
		x=read();
		sum[k]=x%p;
		return;
	}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	sum[k]=(sum[k<<1]+sum[k<<1|1])%p;
}
void Add(int k,int l,int r,int v)//加法 
{
	add[k]+=v;
	sum[k]+=(r-l+1)*v;
	return;
}
void Mul(int k,int l,int r,int v)//乘法 
{
	mul[k]*=v;
	sum[k]*=v;
	add[k]*=v;
}
void pushdown(int k,int l,int r,int mid)//下传 
{
	if(add[k]==0&&mul[k]==1)return;
	Mul(k<<1,l,mid,mul[k]%p);
	Add(k<<1,l,mid,add[k]%p);
	Mul(k<<1|1,mid+1,r,mul[k]%p);
	Add(k<<1|1,mid+1,r,add[k]%p);
	mul[k]=1;
	add[k]=0;
}
void change1(int k,int l,int r,int x,int y,int v)//乘法 
{
	if(x<=l&&r<=y){
		Mul(k,l,r,v);
		return;
	}
	int mid=l+r>>1;
	pushdown(k,l,r,mid);
	if(x<=mid)change1(k<<1,l,mid,x,y,v);
	if(y>mid )change1(k<<1|1,mid+1,r,x,y,v);
	sum[k]=(sum[k<<1]+sum[k<<1|1])%p;
}
void change2(int k,int l,int r,int x,int y,int v)//加法 
{
	if(x<=l&&r<=y){
		Add(k,l,r,v);
		return;
	}
	int mid=l+r>>1;
	pushdown(k,l,r,mid);
	if(x<=mid)change2(k<<1,l,mid,x,y,v);
	if(y>mid )change2(k<<1|1,mid+1,r,x,y,v);
	sum[k]=(sum[k<<1]+sum[k<<1|1])%p;
}
ll query(int k,int l,int r,int x,int y)//区间询问 
{
	int mid=l+r>>1;
	if(x<=l&&r<=y)return sum[k];
	pushdown(k,l,r,mid);
	ll res=0;
	if(x<=mid)res+=query(k<<1,l,mid,x,y)%p;
	if(y>mid)res+=query(k<<1|1,mid+1,r,x,y)%p;
	return res%p;
}
int main()
{
	n=read();
	m=read();
	p=read();
	build(1,1,n);
	for(int i=1;i<=4*n;i++)
	mul[i]=1,add[i]=0;
	while(m--)
	{
		int k,x,y;
		k=read();
		x=read();
		y=read();
		if(k==1)
		{
			k=read();
			change1(1,1,n,x,y,k%p);
			continue;
		}
		if(k==2)
		{
			k=read();
			change2(1,1,n,x,y,k%p);
			continue;
		}
		printf("%lld\n",query(1,1,n,x,y));
	}
	return 0;
}

其他点全WA,已经调了一晚上,实在不知道错在哪

2020/8/5 20:08
加载中...