线段树模版2求大佬帮忙!!!
查看原帖
线段树模版2求大佬帮忙!!!
806448
hjwen25楼主2023/6/26 21:31

代码如下,但不知道为什么0pts...(甚至样例都没过)

#include <bits/stdc++.h>
using namespace std;
long long n,m,p,a[100001],s[400001],t,ql,qr,k,tag[400001],mul[400001];
void create(long long o,long long l,long long r){
	if(l==r){
		s[o]=a[l];
		return ;
	}
	long long m=(l+r)/2,lch=m*2,rch=lch+1;
	create(lch,l,m);
	create(rch,m+1,r);
	s[o]=(s[lch]+s[rch])%p;
}
void fn(long long o,long long l,long long r){
	long long m=(l+r)/2,lch=m*2,rch=lch+1;
	
	s[lch]=(s[lch]*mul[o])%p;
	s[rch]=(s[lch]*mul[o])%p;
	
	s[lch]=(s[lch]+tag[o]*(m-l+1))%p;
	s[rch]=(s[rch]+tag[o]*(r-m))%p;
	
	mul[lch]=(mul[lch]*mul[o])%p;
	mul[rch]=(mul[lch]*mul[o])%p;
	
	tag[lch]=(tag[lch]*mul[o]+tag[o])%p;
	tag[rch]=(tag[rch]*mul[o]+tag[o])%p;
	
	mul[o]=1;
	tag[o]=0;
}
long long find(long long o,long long l,long long r,long long ql,long long qr){
	long long m=(l+r)/2,lch=m*2,rch=lch+1;
	if(ql<=l && r<=qr) return s[o];
	
	fn(o,l,r);
	
	if(qr<=m) return find(lch,l,m,ql,qr);
	if(ql>m) return find(rch,m+1,r,ql,qr);
	return (find(lch,l,m,ql,qr)+find(rch,m+1,r,ql,qr))%p;
}
void add(long long o,long long l,long long r,long long ql,long long qr,long long k){
	long long m=(l+r)/2,lch=m*2,rch=lch+1;
	if(ql<=l && r<=qr){
		tag[o]+=k;
		s[o]+=k*(r-l+1);
		return ;
	}
	
	fn(o,l,r);
	
	if(qr<=m) add(lch,l,m,ql,qr,k);
	else if(ql>m) add(rch,m+1,r,ql,qr,k);
	else{add(lch,l,m,ql,qr,k); add(rch,m+1,r,ql,qr,k);}
	
	s[o]=(s[lch]+s[rch])%p;
}
void mult(int o,int l,int r,int ql,int qr,int k){
	long long m=(l+r)/2,lch=m*2,rch=lch+1;
	if(ql<=l && r<=qr){
		s[o]=(s[o]*k)%p;
		mul[o]*=k;
		return ;
	}
	
	fn(o,l,r);
	
	if(qr<=m) mult(lch,l,m,ql,qr,k);
	else if(ql>m) mult(rch,m+1,r,ql,qr,k);
	else{mult(lch,l,m,ql,qr,k); mult(rch,m+1,r,ql,qr,k);}
	
	s[o]=(s[lch]+s[rch])%p;
}
int main(){
	for(int i=0;i<400001;i++){
		mul[i]=1;
		tag[i]=0;
	}
	scanf("%lld%lld%lld",&n,&m,&p);
	for(long long i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	create(1,1,n);
	while(m--){
		scanf("%lld%lld%lld",&t,&ql,&qr);
		if(t==1){
			scanf("%lld",&k);
			mult(1,1,n,ql,qr,k);
		}
		if(t==2){
			scanf("%lld",&k);
			add(1,1,n,ql,qr,k);
		}
		if(t==3)
			printf("%lld\n",find(1,1,n,ql,qr));
	}
	return 0;
}
2023/6/26 21:31
加载中...