82pts,求调
查看原帖
82pts,求调
785630
YangXiaopei楼主2025/1/15 09:03
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, x, id, l[400005], r[400005], fa[400005], ans[400005], vis[400005][3];
struct node{
	int x, id;
};
stack<node> st;
vector<int> v[400005];
void init(){
	for(int i = 1; i <= n; i++){
		fa[i] = i;
		ans[i] = -1;
	}
}
int find(int x){
	if(fa[x] == x){
		return x;
	}
	return fa[x] = find(fa[x]);
}
void dfs(int cur){
	ans[cur] = st.size();
	for(auto i : v[cur]){
		if(ans[i] != -1){
			continue;
		}
		else{
			dfs(i);
		}
	}
}
void unionn(int x, int y){
	if(find(x) == 1){
		dfs(y);
		fa[find(y)] = find(x);
	}
	else if(find(y) == 1){
		dfs(x);
		fa[find(x)] = find(y);
	}
	else{
		fa[find(x)] = find(y);
	}
}
signed main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> l[i] >> r[i];
	}
	init();
	for(int i = 1; i <= m; i++){
		cin >> x >> id;
		vis[x][id] = 1;
		st.push({x, id});
	}
	for(int i = 1; i <= n; i++){
		if(!vis[i][1] && l[i] != -1){
			unionn(i, l[i]);
			v[i].push_back(l[i]);
			v[l[i]].push_back(i);
		}
		if(!vis[i][2] && r[i] != -1){
			unionn(i, r[i]);
			v[r[i]].push_back(i);
			v[i].push_back(r[i]);
		}
	}
	while(!st.empty()){
		x = st.top().x, id = st.top().id;
		st.pop();
		if(id == 1){
			if(find(x) == find(l[x])){
				continue;
			}
			unionn(x, l[x]);
			v[x].push_back(l[x]);
			v[l[x]].push_back(x);
		}
		else{
			if(find(x) == find(r[x])){
				continue;
			}
			unionn(x, r[x]);
			v[x].push_back(r[x]);
			v[r[x]].push_back(x);
		}
	}
	for(int i = 1; i <= n; i++){
		cout << ans[i] << "\n";
	}
	return 0;
}
2025/1/15 09:03
加载中...