WA9分求助
查看原帖
WA9分求助
560006
yzq_yzq楼主2023/3/3 21:10
#include<bits/stdc++.h>
using namespace std;
template<int T> struct DSU{
	int f[T+5],size;
	DSU(){ for(int i=0;i<=T;i++) f[i]=i; }
	int get(int x){
		if(f[x]==x) return x;
		return f[x]=get(f[x]);
	}
	inline bool same(int x,int y){ return get(x)==get(y); }
	inline void merge(int x,int y){
		int fx=get(x),fy=get(y);
		if(fx==fy) return;
		if(fx<fy) swap(fx,fy);
		f[fx]=fy;
		return;
	}
	inline void clear(){ for(int i=0;i<=T;i++) f[i]=i; }
};
int d[200010][2],n,m,siz,cnt,o[200020][2],ans[200020],x[200200],y[200020];
bool mp[200020][2];
vector<int> p[200002],id[200020];
DSU<200020> f;
inline void add(int x,int y,int i){
	p[x].push_back(y);
	p[y].push_back(x);
	id[x].push_back(i);
	id[y].push_back(i);
}
int main(){//Never gonna give you up! 逸一时误一世逸久逸久罢宜龄
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%d%d",&d[i][0],&d[i][1]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x[i],&y[i]); y[i]--;
		mp[x[i]][y[i]]=1;
	}
	for(int i=1;i<=n;i++){
		if(d[i][0]>0&&!mp[i][0]) add(i,d[i][0],++cnt),o[i][0]=cnt,f.merge(i,d[i][0]);
		if(d[i][1]>0&&!mp[i][1]) add(i,d[i][1],++cnt),o[i][1]=cnt,f.merge(i,d[i][1]);
	}
	for(int i=1;i<=n;i++) if(f.get(i)==1) ans[i]=-1; else ans[i]=0;
	//for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
	for(int i=m;i>=1;i--){
		if(d[x[i]][y[i]]>0){
			f.merge(d[x[i]][y[i]],x[i]);
			add(d[x[i]][y[i]],x[i],++cnt);
			if(f.get(x[i])==1) 
				if(ans[x[i]]==0){
					ans[x[i]]=i-1;
					int u=x[i];
					for(int j=0;j<p[u].size();j++){
						if(ans[p[u][j]]==0)
						ans[p[u][j]]=i-1;
					}
				}
			if(f.get(d[x[i]][y[i]])==1) 
				if(ans[d[x[i]][y[i]]]==0){
					ans[d[x[i]][y[i]]]=i-1;
					int u=d[x[i]][y[i]];
					for(int j=0;j<p[u].size();j++){
						if(ans[p[u][j]]==0)
						ans[p[u][j]]=i-1;
					}
				}
		}
		//for(int j=1;j<=n;j++) printf("%d ",f.f[j]); puts("");
	}
	ans[1]=-1;
	for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
	return 0;
}
//老少欢呼笑语声,
//猪羊爆炸赛神明。
//出行小队追风景,
//马列新装展眼睛。
//一路春光迎客至,
//个人好梦乐心平。
//顶峰大厦开怀望,
//俩会朋友共举情。
2023/3/3 21:10
加载中...