社区讨论

全WA求调玄两关

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

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@lymrxd8t
此快照首次捕获于
2024/07/15 17:20
2 年前
此快照最后确认于
2024/07/15 18:31
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int a[2313222],w[12323232];
int mx[1232132];
int laz[2323213];
int che[2132132];
int d;
void build(int id,int l,int r){
	che[id]=1;
	if(l==r){
		w[id]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	w[id]=w[id<<1]+w[id<<1|1];
	return ;
}
void push_down(int id,int l,int r){
	int mid=l+r>>1;
	laz[id<<1]+=laz[id];
	laz[id<<1|1]+=laz[id];
	che[id<<1]*=che[id];
	che[id<<1|1]*=che[id];
	w[id<<1|1]=che[id]*w[id<<1|1]+(r-mid)*laz[id];
	w[id<<1]=che[id]*w[id<<1]+(mid-l+1)*laz[id];
	w[id<<1]=((w[id<<1]%d)+d)%d;
	w[id<<1|1]=((w[id<<1|1]%d)+d)%d;
	laz[id<<1|1]=((laz[id<<1|1]%d)+d)%d;
	laz[id<<1]=((laz[id<<1]%d)+d)%d;
	che[id<<1]=((laz[id<<1]%d)+d)%d;
	che[id<<1|1]=((laz[id<<1|1]%d)+d)%d;
	che[id]=1;
	laz[id]=0;
}
int find(int id,int l,int r,int L,int R){
	if(L==l&&R==r){
	return w[id];
	}
	push_down(id,l,r);
	int mid=l+r>>1;
	if(R<=mid) return find(id<<1,l,mid,L,R);
	else if(L>mid) return find(id<<1|1,mid+1,r,L,R);
	else return ((find(id<<1,l,mid,L,mid)%d)+(find(id<<1|1,mid+1,r,mid+1,R)%d)+d)%d;
}
void update(int id,int l,int r,int L,int R,int c,int op){
	if(l==L&&R==r){
		if(op==2){
		w[id]+=(r-l+1)*c;
		laz[id]+=c;
		w[id]=((w[id]%d)+d)%d;
		laz[id]=((laz[id]%d)+d)%d;
		return ;
		}
		else{
		w[id]*=c;
		che[id]*=c;
		w[id]=((w[id]%d)+d)%d;
		che[id]=((che[id]%d)+d)%d;
		return ;
		}
	}
	int mid=l+r>>1;
	push_down(id,l,r);
	if(R<=mid) update(id<<1,l,mid,L,R,c,op);
	else if(L>mid)update(id<<1|1,mid+1,r,L,R,c,op);
	else update(id<<1,l,mid,L,mid,c,op),update(id<<1|1,mid+1,r,mid+1,R,c,op);
	w[id]=w[id<<1]+w[id<<1|1];
	w[id]=((w[id]%d)+d)%d;
	return ;
}
main(){
	cin>>n>>m>>d;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
		while(m--){
		int op;
		cin>>op;
		if(op==1){
		int l,r,x;
		cin>>l>>r>>x;
		update(1,1,n,l,r,x,op);	
		}
		else if(op==2){
		int l,r,x;
		cin>>l>>r>>x;
		update(1,1,n,l,r,x,op);	
		}
		else{
			int l,r;
			cin>>l>>r;
			cout<<(((find(1,1,n,l,r)%d)+d)%d)<<endl;
		}
}
}

回复

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

正在加载回复...