求助 为什么每次清空到这个节点刚加入完会WA?
查看原帖
求助 为什么每次清空到这个节点刚加入完会WA?
768476
gf202276楼主2024/10/16 11:32
#include<bits/stdc++.h>
using namespace std;
int fa[1005050],h[1005050];
vector<pair<int,int> >vec[1005050<<2];
int n,m,k,ans[1005050],top=0;
#define pb(x,y) push_back(make_pair(x,y))
struct poi{
	int u,v,delta;
}st[3005050];
int getf(int x){
	if(x==fa[x])return x;
	return getf(fa[x]);
}
void merge(int u,int v){
	int f1=getf(u),f2=getf(v);
	if(f1==f2)return;
	if(h[f1]<h[f2])swap(f1,f2);
	st[++top]=(poi){f1,f2,(h[f2]==h[f1])};
	fa[f2]=f1;
	h[f1]+=(h[f2]==h[f1]);
}
void add(int p,int s,int t,int x,int y,int l,int r){
	if(l<=s&&t<=r){
		vec[p].pb(x,y);
		return;
	}
	int mid=(s+t)/2;
	if(l<=mid)add(p<<1,s,mid,x,y,l,r);
	if(r>mid)add(p<<1|1,mid+1,t,x,y,l,r);
}
void solve(int p,int s,int t){
	//cout<<s<<" "<<t<<'\n';
	int fl=1;
	for(pair<int,int> d:vec[p]){
		int x=d.first,y=d.second;
		int f1=getf(x),f2=getf(y);
		if(f1^f2){
			merge(x+n,y);merge(y+n,x);	
		}
		else{
			fl=0;
		}
	}
	if(fl==0){
		for(int i=s;i<=t;i++)puts("No");
		return;
	}
	if(s==t){
		puts("Yes");return;
	}
	int mid=(s+t)/2;int lsttop=top;
	solve(p<<1,s,mid);solve(p<<1|1,mid+1,t);
	while(top>lsttop){
		poi tmp=st[top];
		fa[tmp.v]=tmp.v;
		h[tmp.u]-=tmp.delta;
		top--;
	}
}
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=2*n;i++)fa[i]=i,h[i]=1;
	for(int i=1;i<=m;i++){
		int x,y,l,r;
		cin>>x>>y>>l>>r;
		if(l==r)continue;
		add(1,1,k,x,y,l+1,r);
	}
	solve(1,1,k);
} 
2024/10/16 11:32
加载中...