...思路代码和题解几乎都一样
查看原帖
...思路代码和题解几乎都一样
736801
MspAInt楼主2022/10/2 17:54

全(W\color{red}{W})A\color{green}{A}

#include<bits/stdc++.h>
#define long long long
#define MAXN 4000001
using namespace std;
long n,m,r;
struct tree{
	long l,r,s;
	long p;
	long u;
};
tree t[MAXN];
long a[MAXN];
void addtree(long k,long l,long r){
	t[k].l=l;
	t[k].r=r;
	t[k].u=1;
	if(l==r){
		t[k].s=a[l]%r;
		return;
	}
	long mid=((l+r)>>1);
	addtree((k<<1),l,mid);
	addtree((k<<1)+1,mid+1,r);
	t[k].s=(t[(k<<1)].s+t[(k<<1)+1].s)%r;
	return;
}
void fil(long k,long v,char op){
	if(op=='*'){
		t[k].s=t[k].s*v%r;
		t[k].p=t[k].p*v%r;
		t[k].u=t[k].u*v%r;
	}else if(op=='+'){
		t[k].s+=((t[k].r-t[k].l+1)*v)%r;
		t[k].p=(t[k].p+v)%r;
	}
}
void pushdown(long k){
	long ls=(k<<1),rs=(k<<1)+1;
	long u=t[k].u,p=t[k].p;
	t[ls].s=(((t[ls].s*u%r)+(t[ls].r-t[ls].l+1)*p)%r)%r;
	t[rs].s=(((t[rs].s*u%r)+(t[rs].r-t[rs].l+1)*p)%r)%r;
	t[ls].u=t[ls].u*u%r;
	t[rs].u=t[rs].u*u%r;
	t[ls].p=(t[ls].p*u+p)%r;
	t[rs].p=(t[rs].p*u+p)%r;
	t[k].p=0;
	t[k].u=1;
	return;
}
void plu(long k,long x,long y,long z){
	long l=t[k].l;
	long r=t[k].r;
	if(l>y||r<x)return;
	if(l>=x&&r<=y){
		fil(k,z,'+');
		return;
	}
	pushdown(k);
	if(t[(k<<1)].r>=x)plu((k<<1),x,y,z);
	if(t[(k<<1)+1].l<=y)plu((k<<1)+1,x,y,z);
	t[k].s=(t[(k<<1)].s+t[(k<<1)+1].s)%r;
	return;
}
void mul(long k,long x,long y,long z){
	long l=t[k].l;
	long r=t[k].r;
	if(l>y||r<x)return;
	if(l>=x&&r<=y){
		fil(k,z,'*');
		return;
	}
	pushdown(k);
	if(t[(k<<1)].r>=x)mul((k<<1),x,y,z);
	if(t[(k<<1)+1].l<=y)mul((k<<1)+1,x,y,z);
	t[k].s=(t[(k<<1)].s+t[(k<<1)+1].s)%r;
	return;
}
long out(long k,long x,long y){
	long l=t[k].l;
	long r=t[k].r;
	if(l>y||r<x)return 0;
	if(l>=x&&r<=y)
	return t[k].s;
	pushdown(k);
	long ans=0;
	if(t[(k<<1)].r>=x)ans+=out((k<<1),x,y)%r;
	if(t[(k<<1)+1].l<=y)ans+=out((k<<1)+1,x,y)%r;
	return ans%r;
}
int main(){
	cin>>n>>m>>r;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	addtree(1,1,n);
	for(int i=1;i<=m;i++){
		long op,x,y,z;
		cin>>op>>x>>y;
		if(op==1){
			cin>>z;
			z%=r;
			mul(1,x,y,z);
		}else if(op==2){
			cin>>z;
			z%=r;
			plu(1,x,y,z);
		}else{
			cout<<out(1,x,y)<<endl;
		}
	}
	return 0;
}

算是比较简洁了

求调QAQQAQ

2022/10/2 17:54
加载中...