过样例但WA,线段树求助
查看原帖
过样例但WA,线段树求助
232900
Dolphin20080317楼主2021/8/30 18:35
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
struct data{
	LL mul,add;
};
data lazy[500005];
LL n,p;
LL v[500005],a[500005];
LL ls(LL x){return x<<1LL;}
LL rs(LL x){return x<<1LL|1LL;}
void push_up(LL x){
	v[x]=(v[ls(x)]+v[rs(x)])%p;
}
void build(LL l,LL r,LL x){
	lazy[x].mul=1LL;
	lazy[x].add=0LL;
	if(l==r){
		v[x]=a[l]%p;
		return;
	}
	LL mid=(l+r)>>1;
	build(l,mid,ls(x));
	build(mid+1,r,rs(x));
	push_up(x);
	v[x]=v[x]%p;
}
void push_down(LL l,LL r,LL x){
	LL mid=(l+r)>>1LL;
	v[ls(x)]=(1LL*v[ls(x)]*lazy[x].mul%p+1LL*lazy[x].add*(l-mid+1)%p)%p;
	v[rs(x)]=(1LL*v[rs(x)]*lazy[x].mul%p+1LL*lazy[x].add*(r-mid)%p)%p;
	lazy[ls(x)].mul=(1LL*lazy[ls(x)].mul%p*lazy[x].mul)%p;
	lazy[rs(x)].mul=(1LL*lazy[rs(x)].mul%p*lazy[x].mul)%p;
	lazy[ls(x)].add=(1LL*lazy[ls(x)].add%p*lazy[x].mul%p+lazy[x].add)%p;
	lazy[rs(x)].add=(1LL*lazy[rs(x)].add%p*lazy[x].mul%p+lazy[x].add)%p; 
	lazy[x].mul=1LL;
	lazy[x].add=0LL;
}
void modify1(LL l,LL r,LL ql,LL qr,LL x,LL k){
	if(l>qr||r<ql) return;
	if(ql<=l&&qr>=r){
		lazy[x].add=(1LL*lazy[x].add*k)%p;
		lazy[x].mul=(1LL*lazy[x].mul*k)%p;
		v[x]=(1LL*v[x]*k)%p;
		return;
	}
	push_down(l,r,x);
	LL mid=(l+r)>>1LL;
	modify1(l,mid,ql,qr,ls(x),k);
	modify1(mid+1,r,ql,qr,rs(x),k);
	push_up(x);
	v[x]=v[x]%p;
}
void modify2(LL l,LL r,LL ql,LL qr,LL x,LL k){
	if(ql<=l&&r<=qr){
		lazy[x].add=(lazy[x].add+k%p)%p;
		v[x]=(v[x]%p+1LL*(r-l+1LL)*k%p)%p;
		//push_down(l,r,x);
		return;
	}
	push_down(l,r,x);
	LL mid=(l+r)>>1LL;
	if(ql<=mid) modify2(l,mid,ql,qr,ls(x),k);
	if(mid<qr) modify2(mid+1LL,r,ql,qr,rs(x),k);
	push_up(x);
	v[x]=v[x]%p;
}
LL query(LL l,LL r,LL ql,LL qr,LL x){
	if(l>qr||r<ql) return 0LL;
	if(ql<=l&&r<=qr){
		return v[x]%p;
	}
	push_down(l,r,x);
	LL mid=(l+r)>>1LL;
	LL res=(query(l,mid,ql,qr,ls(x))%p+query(mid+1,r,ql,qr,rs(x))%p)%p;
	return res; 
}
int main(){
	LL m;
    scanf("%lld%lld%lld",&n,&m,&p);
    for(LL i=1LL;i<=n;i++) scanf("%lld",&a[i]);
    build(1LL,n,1LL);
    //print();
    for(LL i=1LL;i<=m;i++){
    	LL a,b,c,d;
    	scanf("%lld",&a);
    	if(a==1LL){
    		scanf("%lld%lld%lld",&b,&c,&d);
    		modify1(1LL,n,b,c,1LL,d);
		}
		if(a==2LL){
			scanf("%lld%lld%lld",&b,&c,&d);
			modify2(1LL,n,b,c,1LL,d);
		}
		if(a==3LL){
			scanf("%lld%lld",&b,&c);
			LL ans=query(1LL,n,b,c,1LL);
			printf("%lld\n",ans); 
		}
	}
	return 0;
}

我已经快调废了

2021/8/30 18:35
加载中...