社区讨论

高二老年人求调模版

P5787【模板】线段树分治 / 二分图参与者 14已保存回复 20

讨论操作

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

当前回复
20 条
当前快照
1 份
快照标识符
@mhizshq1
此快照首次捕获于
2025/11/03 18:23
4 个月前
此快照最后确认于
2025/11/03 20:26
4 个月前
查看原帖
妈的
CPP
#include<bits/stdc++.h>
#define int long long
#define INF 1e18
#define N 1000005
using namespace std;
struct node{
	int x,y;
};
int n,m,k,fa[N],siz[N],ans[N];
vector<node>vt[N];
int Find(int x){
	return x==fa[x]?x:Find(fa[x]);
}
void merge(int x,int y,vector<node>v){
	if(siz[x]>siz[y]) swap(x,y);
	fa[x]=y,siz[y]+=siz[x];
	v.push_back(node{x,y});
}
void trace(vector<node>v){
	for(node t:v) siz[t.y]-=siz[t.x],fa[t.x]=fa[t.x];
}
void add(int p,int l,int r,int L,int R,int x,int y){
	if(L<=l&&r<=R){
		vt[p].push_back(node{x,y});
		return;
	}
	int mid=l+r>>1;
	if(L<=mid) add(p<<1,l,mid,L,R,x,y);
	if(R>mid) add(p<<1|1,mid+1,r,L,R,x,y);
}
void solve(int p,int l,int r){
	int fl=1,mid=l+r>>1; vector<node>res;
	for(node t:vt[p]){
		int fx1=Find(t.x),fx2=Find(t.x+n),fy1=Find(t.y),fy2=Find(t.y+n);
		if(fx1==fy1){ fl=0; break; }
		merge(fx1,fy2,res),merge(fx2,fy1,res);
	}
	if(fl){
		if(l==r) ans[l]=1;
		else solve(p<<1,l,mid),solve(p<<1|1,mid+1,r);
	}
	trace(res);
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m>>k;
	for(int i=1,x,y,l,r;i<=m;i++){
		cin>>x>>y>>l>>r,l++;
		add(1,1,k,l,r,x,y);
	}
	for(int i=1;i<=n*2;i++) fa[i]=i,siz[i]=1;
	solve(1,1,k);
	for(int i=1;i<=k;i++) cout<<(ans[i]?"Yes\n":"No\n");
	return 0;
}

回复

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

正在加载回复...