线段树分治模板求助
查看原帖
线段树分治模板求助
602803
_qingshu_楼主2024/9/27 20:31
#include<bits/stdc++.h>
int n,m,k,fa[1200010],Maxdep[1200010];
struct edge{int u,v;}e[1200010];
struct node{
	int lef,rig;
	vector<int>q;
}tr[1200010];
inline void build(int id,int lef,int rig){
	tr[id].lef=lef;tr[id].rig=rig;
	if(lef==rig)return ;
	build(id<<1,lef,lef+rig>>1);
	build(id<<1|1,(lef+rig>>1)+1,rig);
}
inline void modify(int id,int lef,int rig,int ID){
	if(tr[id].lef>rig||tr[id].rig<lef)return;
	if(tr[id].lef>=lef&&tr[id].rig<=rig)
		return void(tr[id].q.emplace_back(ID));
	modify(id<<1,lef,rig,ID);
	modify(id<<1|1,lef,rig,ID);
}
inline int find(int x){
	while(fa[x]!=x)x=fa[x];
	return x;
}
struct TMP{
	int u,v,flag;
}tmp[1200010]; 
int tot=0;
inline void add(int u,int v){
	if(Maxdep[v]>Maxdep[v])swap(u,v);
	tmp[++tot]={u,v,Maxdep[u]==Maxdep[v]};
	fa[u]=v;if(Maxdep[u]==Maxdep[v])Maxdep[v]++;
}
inline void solve(int id,int lef,int rig,int flag=1){
	int tmptot=tot;
	for(int i : tr[id].q){
		int u=find(e[i].u),v=find(e[i].v);
		if(u==v){
			for(int j=lef;j<=rig;j++)
				cout<<"No\n";
			flag=0;break;
		}
		add(u,find(e[i].v+n));
		add(v,find(e[i].u+n));
	}
	if(flag){
		if(lef==rig)cout<<"Yes\n";
		else solve(id<<1,lef,lef+rig>>1),
			 solve(id<<1|1,(lef+rig>>1)+1,rig);
	}
	while(tot>tmptot){
		int u=tmp[tot].u,v=tmp[tot].v,flag=tmp[tot].flag;
		Maxdep[v]-=flag;fa[u]=u;tot--;
	}
}
int main(){
//	freopen("c.in","r",stdin);
//	freopen("c.out","w",stdout);
	cin>>n>>m>>k;build(1,1,n);
	for(int i=1,lef,rig;i<=m;i++){
		cin>>e[i].u>>e[i].v;
		cin>>lef>>rig;lef++;
		modify(1,lef,rig,i);
	}
	for(int i=1;i<=(n<<1);i++)
		fa[i]=i,Maxdep[i]=1;
	solve(1,1,k);
}

2024/9/27 20:31
加载中...