제출 #1235923

#제출 시각아이디문제언어결과실행 시간메모리
1235923MuhammadSaram수천개의 섬 (IOI22_islands)C++20
0 / 100
1114 ms1060564 KiB
#include "islands.h"
#include <bits/stdc++.h>

using namespace std;

const int M = 1e5 + 1;

set<pair<int,int>> rev[M],nei[M];
bool del[M];
set<int> se;
int par[M], id[M], vis[M], r;

void rem()
{
	int x=*se.begin();se.erase(x);
	del[x]=1;
	for (auto [i,j]:rev[x])
	{
		nei[i].erase({x,j});
		if (nei[i].empty()) se.insert(i);
	}
}

vector<int> cyc[2], pre[2];

void dfs(int u, int o)
{
	vis[u]=1;
	for (auto [i,x]:nei[u])
	{
		if (cyc[o].size()) return;
		if (!vis[i])
			par[i]=u, id[u]=x, dfs(i,o);
		else if(vis[i]==1)
		{
			int v=u;
			while (v!=i)
				cyc[o].push_back(id[v]), v=par[v];
			reverse(cyc[o].begin(), cyc[o].end());
			cyc[o].push_back(x);
			v=i;
			while (v!=r)
				pre[o].push_back(id[v]), v=par[v];
			reverse(pre[o].begin(),pre[o].end());
		}
	}
	vis[u]=2;
}

bool eq(vector<int> v, vector<int> v1)
{
	sort(v.begin(), v.end());
	sort(v1.begin(), v1.end());
	return v==v1;
}

variant<bool, vector<int>> find_journey(int n, int m, vector<int> U, vector<int> V)
{
	for (int i=0;i<m;i++)
		rev[V[i]].insert({U[i],i}),nei[U[i]].insert({V[i],i});
	for (int i=0;i<n;i++)
		if (nei[i].empty()) se.insert(i);
	vector<int> v,ans;
	int cur=0;
	while (1)
	{
		while (!se.empty())
			rem();
		if (del[cur] && nei[cur].empty())
			return false;
		if (nei[cur].size()==1)
			v.push_back(nei[cur].begin()->second), cur=nei[cur].begin()->first,
			se.insert(cur),rem();
		if (se.empty()) break;
	}
	vis[cur]=1, r=cur;
	for (auto [i,x]:nei[cur])
		par[i]=cur, id[i]=x;
	auto it=nei[cur].begin();
	dfs(it->first,0);it++;
	dfs(it->first,1);
	ans=v;
	if (eq(cyc[0], cyc[1]))
	{
		for (int i:pre[0]) ans.push_back(i);
		for (int i:cyc[0]) ans.push_back(i);
		reverse(pre[0].begin(), pre[0].end());
		for (int i:pre[0]) ans.push_back(i);
		for (int i:pre[1]) ans.push_back(i);
		reverse(cyc[1].begin(), cyc[1].end());
		for (int i:cyc[1]) ans.push_back(i);
		reverse(pre[1].begin(), pre[1].end());
		for (int i:pre[1]) ans.push_back(i);
	}
	else
	{
		for (int i:pre[0]) ans.push_back(i);
		for (int i:cyc[0]) ans.push_back(i);
		reverse(pre[0].begin(), pre[0].end());
		for (int i:pre[0]) ans.push_back(i);
		
		for (int i:pre[1]) ans.push_back(i);
		for (int i:cyc[1]) ans.push_back(i);
		reverse(pre[1].begin(), pre[1].end());
		for (int i:pre[1]) ans.push_back(i);
		
		reverse(pre[0].begin(), pre[0].end());
		for (int i:pre[0]) ans.push_back(i);
		reverse(cyc[0].begin(), cyc[0].end());
		for (int i:cyc[0]) ans.push_back(i);
		reverse(pre[0].begin(), pre[0].end());
		for (int i:pre[0]) ans.push_back(i);
		
		reverse(pre[1].begin(), pre[1].end());
		for (int i:pre[1]) ans.push_back(i);
		reverse(cyc[1].begin(), cyc[1].end());
		for (int i:cyc[1]) ans.push_back(i);
		reverse(pre[1].begin(), pre[1].end());
		for (int i:pre[1]) ans.push_back(i);
	}
	reverse(v.begin(), v.end());
	for (int i:v) ans.push_back(i);
	return ans;
}
#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...