社区讨论

本地正常,提交CE求调

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

讨论操作

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

当前回复
29 条
当前快照
1 份
快照标识符
@mhjtqr3z
此快照首次捕获于
2025/11/04 08:22
4 个月前
此快照最后确认于
2025/11/04 10:28
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define Code using
#define By namespace
#define COB std
#define int long long
Code By COB;
constexpr int N=1e5+3,inf=0x7fffffffffffffffll;
struct Node{
	int lc=0,rc=0,lp=0,rp=0,sum=0,mx=INT_MIN,mn=INT_MAX,plus=0,mul=1,cov=inf;
};
#define LC(id) (tree[id].lc)
#define RC(id) (tree[id].rc)
#define LP(id) (tree[id].lp)
#define RP(id) (tree[id].rp)
#define S(id) (tree[id].sum)
#define MX(id) (tree[id].mx)
#define MN(id) (tree[id].mn)
#define P(id) (tree[id].plus)
#define M(id) (tree[id].mul)
#define C(id) (tree[id].cov)
Node tree[N<<1];
int cnt=1,root=1;
inline int GetNewNode(){return ++cnt;}
inline void push_up(int id){
	S(id)=S(LC(id))+S(RC(id)),MX(id)=max(MX(LC(id)),MX(RC(id))),MN(id)=min(MN(LC(id)),MN(RC(id)));
	return;
}
inline void plus_tag(int id,int tag){
	S(id)+=tag*(RP(id)-LP(id)+1),MX(id)+=tag,MN(id)+=tag;
	P(id)+=tag;
	return;
}
inline void mul_tag(int id,int tag){
	S(id)*=tag,MX(id)*=tag,MN(id)*=tag;
	P(id)*=tag,M(id)*=tag;
	return;
}
inline void cov_tag(int id,int tag){
	S(id)=tag*(RP(id)-LP(id)+1),C(id)=MX(id)=MN(id)=tag;
	P(id)=0,M(id)=1;
	return;
}
inline void push_down(int id){
	if(C(id)!=inf) cov_tag(LC(id),C(id)),cov_tag(RC(id),C(id));
	if(M(id)-1) mul_tag(LC(id),M(id)),mul_tag(RC(id),M(id));
	if(P(id)) plus_tag(LC(id),P(id)),plus_tag(RC(id),P(id));
	P(id)=0,M(id)=1,C(id)=inf;
	return;
}
inline void build(int id,int l,int r,int *a){
	LP(id)=l,RP(id)=r;
	if(l==r){S(id)=MX(id)=MN(id)=a[l];return;}
	LC(id)=GetNewNode(),RC(id)=GetNewNode();
	int mid=(l+r)>>1;
	build(LC(id),l,mid,a),build(RC(id),mid+1,r,a);
	push_up(id);
	return;
}
inline int query_sum(int id,int s,int t){
	if(s<=LP(id)&&RP(id)<=t) return S(id);
	int res=0,mid=(LP(id)+RP(id))>>1;
	push_down(id);
	if(s<=mid) res+=query_sum(LC(id),s,t);
	if(t>mid) res+=query_sum(RC(id),s,t);
	return res;
}
inline int query_max(int id,int s,int t){
	if(s<=LP(id)&&RP(id)<=t) return MX(id);
	int res=INT_MIN,mid=(LP(id)+RP(id))>>1;
	push_down(id);
	if(s<=mid) res=max(query_max(LC(id),s,t),res);
	if(t>mid) res=max(query_max(RC(id),s,t),res);
	return res;
}
inline int query_min(int id,int s,int t){
	if(s<=LP(id)&&RP(id)<=t) return MN(id);
	int res=INT_MAX,mid=(LP(id)+RP(id))>>1;
	push_down(id);
	if(s<=mid) res=min(query_min(LC(id),s,t),res);
	if(t>mid) res=min(query_min(RC(id),s,t),res);
	return res;
}
inline void Plus(int id,int s,int t,int val){
	if(s<=LP(id)&&RP(id)<=t){plus_tag(id,val);return;}
	int mid=(LP(id)+RP(id))>>1;
	push_down(id);
	if(s<=mid) Plus(LC(id),s,t,val);
	if(t>mid) Plus(RC(id),s,t,val);
	push_up(id);
	return;
}
inline void Mul(int id,int s,int t,int val){
	if(s<=LP(id)&&RP(id)<=t){mul_tag(id,val);return;}
	int mid=(LP(id)+RP(id))>>1;
	push_down(id);
	if(s<=mid) Mul(LC(id),s,t,val);
	if(t>mid) Mul(RC(id),s,t,val);
	push_up(id);
	return;
}
inline void Cover(int id,int s,int t,int val){
	if(s<=LP(id)&&RP(id)<=t){cov_tag(id,val);return;}
	int mid=(LP(id)+RP(id))>>1;
	push_down(id);
	if(s<=mid) Cover(LC(id),s,t,val);
	if(t>mid) Cover(RC(id),s,t,val);
	push_up(id);
	return;
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	int n,q,m;cin>>n>>q>>m;
	int a[n+1];
	for(int i=1;i<=n;++i) cin>>a[i];
	build(root,1,n,a);
	for(int op,l,r,val;q--;){
		cin>>op>>l>>r;
		switch(op){
			case 3:cout<<query_sum(root,l,r)%m<<'\n';break;
			case -1:cout<<query_max(root,l,r)<<'\n';break;
			case -2:cout<<query_min(root,l,r)<<'\n';break;
			case 2:cin>>val,Plus(root,l,r,val);break;
			case 1:cin>>val,Mul(root,l,r,val);break;
			case 0:cin>>val,Cover(root,l,r,val);break;
		}
	}
	return 0;
}
CE:
Nothing is compiled: OUTPUT exceeds.

回复

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

正在加载回复...