线段树过了样例,全WA求调
查看原帖
线段树过了样例,全WA求调
464732
luqyou楼主2022/10/14 15:52
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
	int l,r;
	ll v,ad,mu;
}a[400001];
int n,m;
ll t[100001],sum[100001],p;
int ls(int u){
	return u<<1;
}
int rs(int u){
	return (u<<1)|1;
}
void build(int u,int L,int R){
	a[u]=(node){L,R,sum[R]-sum[L-1],0};
	if(L!=R){
		int M=L+R>>1;
		build(ls(u),L,M);
		build(rs(u),M+1,R);
	}
}
void pushup(int u){
	a[u].v=a[ls(u)].v+a[rs(u)].v;
}
bool inrange(int L,int R,int l,int r){
	return (L<=l)&&(r<=R);
} 
bool outofrange(int L,int R,int l,int r){
	return (r<L)||(R<l);
}
void pushdown(int u){ 
	int L=a[u].l,R=a[u].r,M=L+R>>1;
	if(L==R) return ;
	if(a[u].mu){
		ll K=a[u].mu;
		a[u].mu=0;
		a[ls(u)].mu*=K%p;
		a[rs(u)].mu*=K%p;
		a[ls(u)].mu%=p;
		a[rs(u)].mu%=p;
		a[ls(u)].v*=K*(M-L+1)%p;
		a[rs(u)].v*=K*(R-M)%p;
		a[ls(u)].v%=p;
		a[rs(u)].v%=p;
	}
	else{
		ll K=a[u].ad;
		a[u].ad=0;
		a[ls(u)].ad+=K;
		a[rs(u)].ad+=K;
		a[ls(u)].v+=K*(M-L+1);
		a[rs(u)].v+=K*(R-M);
	}
}
void update_add(int u,int L,int R,ll k){
	if(a[u].ad||a[u].mu){
		pushdown(u);
	}
	int l=a[u].l,r=a[u].r;
	if(inrange(L,R,l,r)){
		if(a[u].mu) pushdown(u);
		a[u].ad+=k;
		a[u].v+=k*(a[u].r-a[u].l+1);
		pushdown(u);
	}
	else if(!outofrange(L,R,l,r)){
		update_add(ls(u),L,R,k);
		update_add(rs(u),L,R,k);
		pushup(u);
	}
}
void update_mul(int u,int L,int R,ll k){
	if(a[u].ad||a[u].mu){
		pushdown(u);
	}
	int l=a[u].l,r=a[u].r;
	if(inrange(L,R,l,r)){
		if(a[u].ad) pushdown(u);
		a[u].mu*=k;
		a[u].mu%=p;
		a[u].v*=k*(a[u].r-a[u].l+1);
		a[u].v%=p;
		pushdown(u);
	}
	else if(!outofrange(L,R,l,r)){
		update_mul(ls(u),L,R,k);
		update_mul(rs(u),L,R,k);
		pushup(u);
	}
}
ll search(int u,int L,int R){
	if(a[u].ad||a[u].mu){
		pushdown(u);
	}
	int l=a[u].l,r=a[u].r;
	if(inrange(L,R,l,r)){
		return a[u].v;
	}
	else if(!outofrange(L,R,l,r)){
		return search(rs(u),L,R)+search(ls(u),L,R);
	}
}
int main(){
	scanf("%d%d%lld",&n,&m,&p);
	for(int i=1;i<=n;i++){
		scanf("%lld",&t[i]);
		sum[i]=sum[i-1]+t[i];
	} 
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op;
		scanf("%d",&op);
		switch(op){
			case 1:{
				int x,y;
				ll k;
				scanf("%d%d%lld",&x,&y,&k);
				update_mul(1,x,y,k);
				break;
			}
			case 2:{
				int x,y;
				ll k;
				scanf("%d%d%lld",&x,&y,&k);
				update_add(1,x,y,k);
				break;
			}
			case 3:{
				int x,y;
				scanf("%d%d",&x,&y);
				printf("%lld\n",search(1,x,y)%p);
				break;
			}
		}
		/*for(int i=1;i<=2*n-1;i++){
			printf(" %d %d %lld %lld %lld\n",a[i].l,a[i].r,a[i].v,a[i].ad,a[i].mu);
		}*/
	}
	return 0;
}
2022/10/14 15:52
加载中...