社区讨论

萌新刚学xdmEPS秒玄关求助

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

讨论操作

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

当前回复
26 条
当前快照
1 份
快照标识符
@mi8hcz4y
此快照首次捕获于
2025/11/21 14:29
3 个月前
此快照最后确认于
2025/11/21 16:22
3 个月前
查看原帖
不理解,找了一中午错还是没过样例。
C
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,q,m;
int a[N];
struct Shu{
	int zhi;
	int ja;
	int cheng;
};
struct xds{
	#define zrz xb<<1
	#define yrz xb<<1|1
	Shu shu[N<<2];
	void hb(int xb){
		shu[xb].zhi=shu[zrz].zhi+shu[yrz].zhi;
	}
	void xc(int xb,int z,int y){
		int zd=z+y>>1;
		shu[zrz].zhi=1ll*shu[zrz].zhi*shu[xb].cheng%m;
		shu[zrz].ja=1ll*shu[zrz].ja*shu[xb].cheng%m;
		shu[zrz].cheng=1ll*shu[zrz].cheng*shu[xb].cheng%m;
		shu[zrz].zhi=(shu[zrz].zhi+1ll*(zd-z+1)*shu[xb].ja%m)%m;
		shu[zrz].ja=(shu[zrz].ja+shu[xb].ja)%m;
		shu[yrz].zhi=1ll*shu[yrz].zhi*shu[xb].cheng%m;
		shu[yrz].ja=1ll*shu[yrz].ja*shu[xb].cheng%m;
		shu[yrz].cheng=1ll*shu[yrz].cheng*shu[xb].cheng%m;
		shu[yrz].zhi=(shu[yrz].zhi+1ll*(zd-z+1)*shu[xb].ja%m)%m;
		shu[yrz].ja=(shu[yrz].ja+shu[xb].ja)%m;
		shu[xb].ja=0;
		shu[xb].cheng=1;
	}
	void jsh(int xb,int z,int y){
		if(z==y){
			shu[xb].zhi=a[z];
			shu[xb].ja=0;
			shu[xb].cheng=1;
			return ;
		}int zd=z+y>>1;
		jsh(zrz,z,zd);
		jsh(yrz,zd+1,y);
		hb(xb);
	}
	void Ja(int xb,int z,int y,int ks,int js,int qz){
		if(ks<=z&&y<=js){
			shu[xb].zhi=(shu[xb].zhi+1ll*(y-z+1)*qz%m)%m;
			shu[xb].ja=(shu[xb].ja+qz)%m;
			return ;
		}xc(xb,z,y);
		int zd=z+y>>1;
		if(ks<=zd)Ja(zrz,z,zd,ks,js,qz);
		if(zd<js)Ja(yrz,zd+1,y,ks,js,qz);
		hb(xb);
	}
	void Cheng(int xb,int z,int y,int ks,int js,int qz){
		if(ks<=z&&y<=js){
			shu[xb].zhi=1ll*shu[xb].zhi*qz%m;
			shu[xb].ja=1ll*shu[xb].ja*qz%m;
			shu[xb].cheng=1ll*shu[xb].cheng*qz%m;
			return ;
		}xc(xb,z,y);
		int zd=z+y>>1;
		if(ks<=zd)Cheng(zrz,z,zd,ks,js,qz);
		if(zd<js)Cheng(yrz,zd+1,y,ks,js,qz);
		hb(xb);
	}
	int cx(int xb,int z,int y,int ks,int js){
		if(ks<=z&&y<=js)return shu[xb].zhi;
		xc(xb,z,y);
		int zd=z+y>>1,fh=0;
		if(ks<=zd)fh+=cx(zrz,z,zd,ks,js);
		if(zd<js)fh+=cx(yrz,zd+1,y,ks,js);
		return fh;
	}
}b;
int main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	b.jsh(1,1,n);
	while(q--){
		int cz,z,y;
		cin>>cz>>z>>y;
		if(cz==1){
			int qz;
			cin>>qz;
			b.Cheng(1,1,n,z,y,qz);
		}else if(cz==2){
			int qz;
			cin>>qz;
			b.Ja(1,1,n,z,y,qz);
		}else cout<<b.cx(1,1,n,z,y)<<"\n";
	}
	return 0;
} 

回复

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

正在加载回复...