社区讨论

求调线段树,啾啾孩子

P3373【模板】线段树 2参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lobc0h3b
此快照首次捕获于
2023/10/29 18:32
2 年前
此快照最后确认于
2023/11/04 00:20
2 年前
查看原帖
CPP
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>

#define re register
#define ll long long
#define maxx 100005
#define lson id*2
#define rson id*2+1

using namespace std;

inline int read(){
	int x=0;int f=1;char c=getchar();
	while(c>'9'||c<'0'){if(c==-1)f=-1;c=getchar();
	}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();
	}
return x*f;
}

inline ll lread(){
	ll x=0;int f=1;char c=getchar();
	while(c>'9'||c<'0'){if(c==-1)f=-1;c=getchar();
	}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();
	}
return x*f;
}

int n,m,MOD;
int a[maxx];

struct node{
	int left,right;
	ll sum;
	
	int Jia;
	int Sheng;
}A[maxx*4];

inline void pushup(int id,int l,int r){
	A[id].sum=A[lson].sum+A[rson].sum;
	A[id].sum=A[id].sum%MOD;
return ;
}

inline void build(int id,int l,int r){
	if(r<l) return ;
	
	A[id].left=l;
	A[id].right=r;
	A[id].Jia=0;
	A[id].Sheng=1;
	
	if(l==r){
		A[id].sum=a[l];
		return ;
	}
	
	int mid=(l+r)/2;
	build(lson,l,mid);
	build(rson,mid+1,r);
	
	pushup(id,l,r);
return ;
}

inline void Add_J(int id,int l,int r,int v){
	A[id].Jia+=v;
	A[id].Jia=A[id].Jia%MOD;
	
	A[id].sum+=(r-l+1)*v;
	A[id].sum=A[id].sum%MOD;
return ;
}

inline void Add_S(int id,int l,int r,int v){
	
	A[id].Sheng=(A[id].Sheng*v)%MOD;
	A[id].Jia=(A[id].Jia*v)%MOD;
		
	A[id].sum*=v;
	A[id].sum=A[id].sum%MOD;
return ;
}

inline void Add(int id,int l,int r,int jia,int mul){
	A[id].sum=(A[id].sum*mul+(jia*(r-l+1)))%MOD;
	
	A[id].Jia=(A[id].Jia*mul+jia)%MOD;
	A[id].Sheng=(A[id].Sheng*mul)%MOD;
	
return ;
}
inline void pushdown(int id,int l,int r,int mid){
	
	
	Add(lson,l,mid,A[id].Jia,A[id].Sheng);
	Add(rson,mid+1,r,A[id].Jia,A[id].Sheng);
	/*
	Add_S(lson,l,mid,A[id].Sheng);
	Add_J(lson,l,mid,A[id].Jia);
	
	
	
	Add_S(rson,mid+1,r,A[id].Sheng);
	Add_J(rson,mid+1,r,A[id].Jia);
	*/
	
	
	A[id].Jia=0;A[id].Sheng=1;
return ;
}

inline void change_J(int id,int l,int r,int x,int y,int v){
	if(x>r||y<l) return ;
	
	if(x<=l&&y>=r){
		Add_J(id,l,r,v);
		
		return ;
	}
	
	int mid=(l+r)/2;
	pushdown(id,l,r,mid);
	
	if(x<=mid){change_J(lson,l,mid,x,y,v);
	}
	if(y>mid){change_J(rson,mid+1,r,x,y,v);
	}
	
	pushup(id,l,r);
return ;
}

inline void change_S(int id,int l,int r,int x,int y,int v){
	if(x>r||y<l) return ;
	
	if(x<=l&&y>=r){
		Add_S(id,l,r,v);
		
		return ;
	}
	
	int mid=(l+r)/2;
	pushdown(id,l,r,mid);
	
	if(x<=mid){change_S(lson,l,mid,x,y,v);
	}
	if(y>mid){change_S(rson,mid+1,r,x,y,v);
	}
	
	pushup(id,l,r);
return ;
}

inline  ll qun(int id,int l,int r,int x,int y){
	if(x<=l&&y>=r){
		return A[id].sum;
	}	
	
	int mid=(l+r)/2;
	
	pushdown(id,l,r,mid);
	
	ll ans=0;
	if(x<=mid) ans+=qun(lson,l,mid,x,y);
	if(y>mid) ans+=qun(rson,mid+1,r,x,y);
	
return ans;
}

int main(){

	n=read();m=read();MOD=read();
	for(re int i=1;i<=n;i++){
		a[i]=lread();
		a[i]=a[i]%MOD;
	}	
	
	build(1,1,n);
	while(m--){
		int kind=read();
		if(kind==1){
			int x,y,v;
			x=read();y=read();v=read();
			v=v%MOD;
			
			change_S(1,1,n,x,y,v);
		}
		if(kind==2){
			int x,y,v;
			x=read();y=read();v=read();
			v=v%MOD;
			
			change_J(1,1,n,x,y,v);
		}
		if(kind==3){
			int x,y;
			x=read();y=read();
			
			printf("%lld\n",qun(1,1,n,x,y)%MOD);
		}
	}

return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...