Submission #1187772

#TimeUsernameProblemLanguageResultExecution timeMemory
1187772ByeWorldThousands Islands (IOI22_islands)C++20
22.75 / 100
112 ms20540 KiB
#include "islands.h"
#include <bits/stdc++.h>
#include <variant>
#include <vector>
#define ll long long
#define pb push_back
#define fi first
#define se second
#define lf ((id<<1))
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
const int MAXN = 2e5+10;
typedef pair<int,int> pii;

int n, m;
int u[MAXN], v[MAXN];
vector<int> ANS;
vector<pii> adj[MAXN];
bool vis[MAXN];
vector<int> stac, cyc;
map<pii,int> ma, ma2;
vector<int> go;

void dfs(int nw, int pa){
	vis[nw] = 1;
	stac.pb(nw);
	for(auto [nx, ed] : adj[nw]){
		if(abs(ed-pa)==1 && u[ed]==v[pa] && u[pa]==v[ed]) continue;
		if(!cyc.empty()) return;

		if(vis[nx]){
			while(stac.back() != nx){
				cyc.pb(stac.back()); stac.pop_back();
			}
			cyc.pb(nx);

			int ba = stac.back(); stac.pop_back();
			while(!stac.empty()){
				go.pb(ma[pii(stac.back(), ba)]);
				ba = stac.back(); stac.pop_back();
			}
			return;
 		} else dfs(nx, ed);
	}
}

void sol(int nw, int pa){
	// cout << nw << " nw\n";
	stac.pb(nw);
	vector<int> vec;
	for(auto [nx, ed] : adj[nw]){
		if(abs(ed-pa)==1 && u[ed]==v[pa] && u[pa]==v[ed]) continue;
		vec.pb(nx);
	}
	if(vec.size() >= 2){
		for(int i=0; i+1<stac.size(); i++) 
			ANS.pb(ma[ pii(stac[i], stac[i+1]) ]);

		int x = vec[0], y = vec[1];
		ANS.pb(ma[pii(nw,x)]);
		ANS.pb(ma[pii(x,nw)]);
		ANS.pb(ma[pii(nw,y)]);
		ANS.pb(ma[pii(y,nw)]);

		ANS.pb(ma[pii(x,nw)]);
		ANS.pb(ma[pii(nw,x)]);
		ANS.pb(ma[pii(y,nw)]);
		ANS.pb(ma[pii(nw,y)]);

		for(int i=stac.size()-1; i>=1; i--) 
			ANS.pb(ma[ pii(stac[i-1], stac[i]) ]);
		return;
	}

	for(auto [nx, ed] : adj[nw]){
		if(ANS.size()) return;
		if(abs(ed-pa)==1 && u[ed]==v[pa] && u[pa]==v[ed]) continue;
		sol(nx, ed);
	}
	stac.pop_back();
}
std::variant<bool, std::vector<int>> find_journey(
    int N, int M, std::vector<int> U, std::vector<int> V) {
    n = N; m = M;
	for(int i=0; i<m; i++){
		u[i] = U[i]+1, v[i] = V[i]+1;
		ma[pii(u[i], v[i])] = i; 
		adj[u[i]].pb({v[i], i});
	}
	for(int i=0; i<m; i++){
		if(ma[pii(u[i], v[i])] == i) continue;
		ma2[pii(u[i], v[i])] = i;
	}
	dfs(1, -1);

	// for(auto in : cyc){
	// 	cout << in << " in\n";
	// }
	if(!cyc.empty()){
		reverse(cyc.begin(), cyc.end());
		for(int i=go.size()-1; i>=0; i--) ANS.pb(go[i]);
		cyc.pb(cyc[0]);

		if(cyc.size() == 3){
			for(int i=0; i+1<cyc.size(); i++){ // ac
				int nx = cyc[i+1];
				ANS.pb(ma[pii(cyc[i], nx)]);
			}
			for(int i=cyc.size()-1; i>=1; i--){ // fd
				int nx = cyc[i-1];
				ANS.pb(ma2[pii(cyc[i], nx)]);
			}
			for(int i=cyc.size()-1; i>=1; i--){ // fd
				int nx = cyc[i-1];
				ANS.pb(ma[pii(nx, cyc[i])]);
			}
			for(int i=0; i+1<cyc.size(); i++){ // ac
				int nx = cyc[i+1];
				ANS.pb(ma2[pii(nx, cyc[i])]);
			}
		} else {
			for(int i=0; i+1<cyc.size(); i++){ // ac
				int nx = cyc[i+1];
				ANS.pb(ma[pii(cyc[i], nx)]);
			}
			for(int i=cyc.size()-1; i>=1; i--){ // fd
				int nx = cyc[i-1];
				ANS.pb(ma[pii(cyc[i], nx)]);
			}
			for(int i=cyc.size()-1; i>=1; i--){ // fd
				int nx = cyc[i-1];
				ANS.pb(ma[pii(nx, cyc[i])]);
			}
			for(int i=0; i+1<cyc.size(); i++){ // ac
				int nx = cyc[i+1];
				ANS.pb(ma[pii(nx, cyc[i])]);
			}
		}

		for(int i=0; i<go.size(); i++) ANS.pb(go[i]);
		return ANS;
	}
	if(adj[1].size() >= 2){
		int x = adj[1][0].fi, y = adj[1][1].fi;
		ANS.pb(ma[pii(1,x)]);
		ANS.pb(ma[pii(x,1)]);
		ANS.pb(ma[pii(1,y)]);
		ANS.pb(ma[pii(y,1)]);

		ANS.pb(ma[pii(x,1)]);
		ANS.pb(ma[pii(1,x)]);
		ANS.pb(ma[pii(y,1)]);
		ANS.pb(ma[pii(1,y)]);
		return ANS;
	}

	stac.clear();
	sol(1,-1);
	if(ANS.size()) return ANS;

	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...