社区讨论

样例过,0分求条,马蜂良好

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mid67ic6
此快照首次捕获于
2025/11/24 21:16
3 个月前
此快照最后确认于
2025/11/24 22:04
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,q,mod,a[N];
int tr[4*N],sizc[4*N],sizj[4*N];
struct node{
	int l,r;
}b[4*N];
void update(int num){
	tr[num]=tr[num*2]+tr[num*2+1];
}
void pushdown(int num){
	tr[num*2]=(tr[num*2]*sizc[num]+sizj[num]*(b[num*2].r-b[num*2].l+1))%mod;
	tr[num*2+1]=(tr[num*2+1]*sizc[num]+sizj[num]*(b[num*2+1].r-b[num*2+1].l+1))%mod;
	sizc[num*2]=(sizc[num*2]*sizc[num])%mod;
	sizc[num*2+1]=(sizc[num*2+1]*sizc[num])%mod;
	sizj[num*2]=(sizj[num*2]*sizc[num]+sizj[num])%mod;
	sizj[num*2+1]=(sizj[num*2+1]*sizc[num]+sizj[num])%mod;
	sizj[num]=0,sizc[num]=1;
	return;
}
void build(int num,int l,int r){
	b[num].l=l,b[num].r=r;
	sizc[num]=1;
	if(l==r){
		tr[num]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(num*2,l,mid);
	build(num*2+1,mid+1,r);
	update(num);
	return;
}
void add1(int num,int l,int r,int x,int y,int k){
	if(x<=l&&y>=r){
		sizc[num]*=k;
		sizc[num]%=mod;
		sizj[num]*=k;
		sizj[num]%=mod;
		tr[num]=(tr[num]*sizc[num])%mod;
		return;
	}
	pushdown(num);
	int mid=(l+r)/2;
	if(x<=mid){
		add1(num*2,l,mid,x,y,k);
	}
	if(y>mid){
		add1(num*2+1,mid+1,r,x,y,k);
	}
	update(num);
}
void add2(int now,int l,int r,int x,int y,int k){
	if(x<=l&&y>=r){
		tr[now]+=k*(r-l+1);
		tr[now]%=mod;
		sizj[now]+=k;
		sizj[now]%=mod;
		return;
	}
	pushdown(now);
	int mid=(l+r)/2;
	if(x<=mid) add2(now*2,l,mid,x,y,k);
	if(y>mid) add2(now*2+1,mid+1,r,x,y,k);
	update(now);
	return;
}
int query(int num,int l,int r,int x,int y){
	if(x<=l&&y>=r){
		return tr[num];
	}
	pushdown(num);
	int res=0,mid=(l+r)/2;
	if(x<=mid){
		res=(res+query(num*2,l,mid,x,y))%mod;
	}
	if(y>mid){
		res=(res+query(num*2+1,mid+1,r,x,y))%mod;
	}
	return res;
}
signed main(){

//	ios::sync_with_stdio(false);
//	cin.tie(0);cout.tie(0);
	
	cin>>n>>q>>mod;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(q--){
		int op;
		cin>>op;
		if(op==1){
			int x,y,k;
			cin>>x>>y>>k;
			add1(1,1,n,x,y,k);
		}else if(op==2){
			int x,y,k;
			cin>>x>>y>>k;
			add2(1,1,n,x,y,k);
		}else{
			int x,y;
			cin>>x>>y;
			cout<<query(1,1,n,x,y)<<"\n";
		}
	}
	
	return 0;
}

回复

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

正在加载回复...