萌新求助,本题为什么不能按照集合大小合并,必须按照高度合并呢?
查看原帖
萌新求助,本题为什么不能按照集合大小合并,必须按照高度合并呢?
502788
轩大虾22楼主2023/11/29 19:46
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define pii pair<int,int>
#define x first
#define y second
const int N=5e5+10;
int n,m,k,x[N],y[N],p[N],d[N];
struct node{
	int l,r;
	vector<int> a;
} tr[N*4];
stack<pii> s;
void build(int u,int l,int r){
	tr[u].l=l,tr[u].r=r;
	if(l==r) return ;
	int mid=(l+r)>>1;
	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
void ins(int u,int l,int r,int x){
	if(tr[u].l>=l&&tr[u].r<=r) {
		tr[u].a.push_back(x);
		return ; 
	}
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid) ins(u<<1,l,r,x);
	if(r>mid) ins(u<<1|1,l,r,x);
}
int find(int x){
	while(x!=p[x]) x=p[x];
	return x;
}
void merge(int x,int y){
	if(x==y) return ;
	if(d[x]>d[y]) swap(x,y);
	s.push({x,d[x]}),p[x]=y,d[y]+=d[x];
}
void dfs(int u,int l,int r){
	bool f=1;
	int sz=s.size();
	for(int i:tr[u].a){
		int u=find(x[i]),v=find(y[i]); 
		if(p[u]==p[v]){
			rep(j,l,r) cout<<"No"<<endl;
			f=0;
			break;
		}
		u=find(x[i]),v=find(y[i]);
		merge(find(x[i]+n),v),merge(find(y[i]+n),u);
	}
	if(f){
		if(l==r) cout<<"Yes"<<endl;
		else{
			int mid=(l+r)>>1;
			dfs(u<<1,l,mid),dfs(u<<1|1,mid+1,r);
		}
	}
	while(s.size()>sz) d[s.top().x]-=s.top().y,p[s.top().x]=s.top().x,s.pop();
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m>>k;
	build(1,1,k);
	rep(i,1,m){
		int l,r;
		cin>>x[i]>>y[i]>>l>>r;
		if(l!=r) ins(1,l+1,r,i);
	}
	rep(i,1,2*n) p[i]=i,d[i]=1;
	dfs(1,1,k);
	return 0;
} 

以上是我按size合并的代码,为什么hack数据T了?

2023/11/29 19:46
加载中...