Submission #1058523

#TimeUsernameProblemLanguageResultExecution timeMemory
1058523tolbiThousands Islands (IOI22_islands)C++17
0 / 100
1 ms604 KiB
#include "islands.h"
#include <bits/stdc++.h>
using namespace std;
struct DSU{
	vector<int> par;
	DSU(int n){
		par.resize(n);
		iota(par.begin(), par.end(), 0);
	}
	int find(int node){
		if (par[node]==node) return node;
		return par[node]=find(par[node]);
	}
	void merge(int a, int b){
		a=find(a);
		b=find(b);
		par[a]=b;
	}
};
std::variant<bool, std::vector<int>> find_journey(
	int N, int M, std::vector<int> U, std::vector<int> V) {
	vector<vector<pair<int,int>>> arr(N);
	for (int i = 0; i < M; i+=2){
		arr[U[i]].push_back({V[i],i});
	}
	vector<bool> vis(N,false);
	vector<pair<int,int>> par(N,{-1,-1});
	vector<int> dept(N,0);
	function<void(int)> dfs = [&](int node)->void{
		if (vis[node]) return;
		vis[node]=true;
		for (auto it : arr[node]){
			if (vis[it.first]) continue;
			dept[it.first]=dept[node]+1;
			par[it.first]={node,it.second};
			dfs(it.first);
		}
	};
	dfs(0);
	DSU dsu(N);
	vector<pair<int,int>> gidio(N,{-1,-1});
	for (int i = 0; i < N; i++){
		if (!vis[i]) continue;
		if (dsu.find(i)!=i) continue;
		for (auto it : arr[i]){
			if (!vis[it.first]) continue;
			if (dsu.find(i)==dsu.find(it.first)){
				gidio[i]=it;
				vector<int> aynilar;
				for (int j = 0; j < N; j++){
					if (dsu.find(i)==dsu.find(j)) aynilar.push_back(j);
				}
				sort(aynilar.begin(), aynilar.end(), [&](int a, int b){
					return dept[a]<dept[b];
				});
				vector<int> ans;
				int nd = aynilar[0];
				while (nd!=-1){
					if (par[nd].first!=-1) ans.push_back(par[nd].second);
					nd=par[nd].first;
				}
				reverse(ans.begin(), ans.end());
				ans.push_back(gidio[aynilar[0]].second);
				nd = gidio[aynilar[0]].first;
				while (nd!=i){
					ans.push_back(gidio[nd].second);
					nd=gidio[nd].first;
				}
				nd = aynilar[0];
				while (nd!=i){
					ans.push_back(gidio[nd].second+1);
					nd=gidio[nd].first;
				}
				while (nd!=-1){
					if (par[nd].first!=-1) ans.push_back(par[nd].second);
					nd=par[nd].first;
				}
				return ans;
			}
			else {
				dsu.merge(i,it.first);
				gidio[i]=it;
				break;
			}
		}
	}
	return false;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...