Submission #637309

#TimeUsernameProblemLanguageResultExecution timeMemory
637309FidanThousands Islands (IOI22_islands)C++17
31 / 100
33 ms5196 KiB
#include <bits/stdc++.h>
#include <variant>
#include "islands.h"
using namespace std;
typedef int ll;
void dfs(ll k, vector<vector<pair<ll, ll>>> &g, vector<bool> &used){
	if(used[k]) return;
	used[k]=true;
	for(ll i=0; i<g[k].size(); i++){
		dfs(g[k][i].first, g, used);
	}
}
variant<bool, vector<int>> find_journey(int n, int m, vector<int> u, vector<int> v){
	if(n==2){
		ll a=-1, b=-1, c=-1;
		for(ll i=0; i<m; i++){
			if(u[i]==0){
				if(a==-1) a=i;
				else b=i;
			}
			else c=i;
		}
		if(b==-1 || c==-1) return false;
		return vector<int>({a, c, b, a, c, b});
	}
	else if(m==n*(n-1)){
		ll a=-1, b=-1, c=-1, d=-1, e=-1, f=-1;
		for(ll i=0; i<m; i++){
			if(u[i]==0 && v[i]==1) a=i;
			if(u[i]==1 && v[i]==0) b=i;
			if(u[i]==1 && v[i]==2) c=i;
			if(u[i]==2 && v[i]==1) d=i;
			if(u[i]==2 && v[i]==0) e=i;
			if(u[i]==0 && v[i]==2) f=i;
		}
		return vector<int>({a, c, e, f, d, b, e, c, a, b, d, f});
	}
	else{
		vector<vector<pair<ll, ll>>> g(n);
		vector<ll> res, res1;
		for(ll i=0; i<m; i++){
			g[u[i]].push_back({v[i], i});
		}
		if(g[0].size()>=2){
			ll a=g[0][0].second, b=g[0][1].second;
			ll a1, b1;
			if(a%2==0) a1=a+1;
			else a1=a-1;
			if(b%2==0) b1=b+1;
			else b1=b-1;
			return vector<int>({a, a1, b, b1, a1, a, b1, b});
		}
		else{
			bool f=false;
			vector<bool> used(n);
			dfs(0, g, used);
			for(ll i=0; i<n; i++){
				if(used[i] && g[i].size()>=3) f=true;
			}
			if(!f) return false;
			ll l=g[0][0].first, k=0;
			res1.push_back(g[0][0].second);
			res.push_back(g[0][0].second);
			while(g[l].size()<3){
				if(g[l][0].first==k){
					res1.push_back(g[l][1].second);
					res.push_back(g[l][1].second);
					k=l;
					l=g[l][1].first;
				}
				else{
					res1.push_back(g[l][0].second);
					res.push_back(g[l][0].second);
					k=l;
					l=g[l][0].first;
				}
			}
			ll a=-1, b=-1;
			for(ll i=0; i<3; i++){
				if(g[l][i].first!=k){
					if(a==-1) a=g[l][i].second;
					else b=g[l][i].second;
				}
			}
			ll a1, b1;
			if(a%2==0) a1=a+1;
			else a1=a-1;
			if(b%2==0) b1=b+1;
			else b1=b-1;
			res.push_back(a);
			res.push_back(a1);
			res.push_back(b);
			res.push_back(b1);
			res.push_back(a1);
			res.push_back(a);
			res.push_back(b1);
			res.push_back(b);
			reverse(res1.begin(), res1.end());
			for(ll asdf:res1) res.push_back(asdf);
			return res;
		}
	}
}
//~ int main(){
	//~ int n, m;
	//~ cin>>n>>m;
	//~ vector<ll> u(m), v(m);
	//~ for(ll i=0; i<m; i++){
		//~ cin>>u[i]>>v[i];
	//~ }
	//~ vector<ll> r=find_journey(n, m, u, v);
	//~ for(ll k:r) cout<<k<<" ";
	//~ return 0;
//~ }

Compilation message (stderr)

islands.cpp: In function 'void dfs(ll, std::vector<std::vector<std::pair<int, int> > >&, std::vector<bool>&)':
islands.cpp:9:15: warning: comparison of integer expressions of different signedness: 'll' {aka 'int'} and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    9 |  for(ll i=0; i<g[k].size(); i++){
      |              ~^~~~~~~~~~~~
#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...