70分求助
查看原帖
70分求助
716721
leo12334楼主2023/1/2 16:39

求助各位大佬,第2,9,10个测试点wa掉了,不知道哪里出的问题

#include<bits/stdc++.h>
using namespace std;
#define maxn 100860
#define ll long long 
struct tree{
	int l,r,len;
	ll v,add,mul=1;
}t[maxn*4];
int n,m,q,op,l,r,P;
ll v,a[maxn];
void brush(int p);
void down(int p,int he,int ji);
void build(int p,int l,int r){
	int mid=(l+r)/2;
	t[p].l=l;t[p].r=r;
	t[p].mul=1;t[p].add=0;
	t[p].len=r-l+1;
	if(l==r){
		t[p].v=a[l]%P;
		return ;
	}
	else{
		build(p*2,l,mid);
		build(p*2+1,mid+1,r);
		t[p].v=(t[p*2+1].v+t[p*2].v)%P;
	}
}
void add(int p,int l,int r,ll v){
	if(l>t[p].r||r<t[p].l)return;
	else{
		if(t[p].r<=r&&t[p].l>=l){
			t[p].v+=t[p].len*v;t[p].v%=P;
			t[p].add+=v;t[p].add%=P;//加的时候正常 
		}
		else{
			brush(p);
			add(p*2,l,r,v);
			add(p*2+1,l,r,v);
			t[p].v=(t[p*2].v+t[p*2+1].v)%P;
		}
	}
}
void mul(int p,int l,int r,ll v){
	if(l>t[p].r||r<t[p].l)return;
	else{
		if(t[p].r<=r&&t[p].l>=l){
			t[p].v*=v;t[p].v%=P;
			t[p].mul*=v;t[p].mul%=P;
			t[p].add*=v;t[p].add%=P;//处理乘法标记的时候要乘加法 
		}
		else{
			brush(p);
			mul(p*2,l,r,v);
			mul(p*2+1,l,r,v);
			t[p].v=(t[p*2].v+t[p*2+1].v)%P;
		}
	}
}
void brush(int p){
	if(t[p].add||t[p].mul>1){
		down(p*2,t[p].add,t[p].mul);
		down(p*2+1,t[p].add,t[p].mul);
		t[p].add=0;
		t[p].mul=1;
	}
}
void down(int p,int he,int ji){
	t[p].v*=ji;t[p].v%=P;
	t[p].v+=he*t[p].len;t[p].v%=P;
	t[p].mul=(t[p].mul*ji)%P;
	t[p].add=(t[p].add*ji+he)%P;
}
ll query(int p,int l,int r){
	if(l>t[p].r||r<t[p].l)
		return 0;
	else{
		if(t[p].r<=r&&t[p].l>=l){
			return t[p].v%P;
		}
		else{
			brush(p);
			return (query(p*2,l,r)+query(p*2+1,l,r))%P;
		}
	}
}
int main(){
	cin>>n>>q>>P;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(q--){
		scanf("%d",&op); 
		if(op==2){
			scanf("%d%d%lld",&l,&r,&v); 
//			cin>>l>>r>>v;
			add(1,l,r,v);
		}
		else if(op==1){
//			cin>>l>>r>>v;
			scanf("%d%d%lld",&l,&r,&v); 
			mul(1,l,r,v);
		}
		else{
			scanf("%d%d",&l,&r); 
			printf("%lld\n",query(1,l,r));
		}
	}
	return 0;
}
2023/1/2 16:39
加载中...