# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
637264 | Fidan | Thousands Islands (IOI22_islands) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include <variant>
#include "islands.h"
using namespace std;
typedef int ll;
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>>> v(n);
for(ll i=0; i<m; i++){
v[u[i]].push_back({v[i], i});
}
if(v[0].size()==2){
ll a=v[0][0].second, b=v[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;
for(ll i=0; i<n; i++){
if(v[i].size()>=3) f=true;
}
if(!f) return false;
vector<ll> res1, res;
res1.push_back(v[0][0].second);
ll l=v[0][0].first, k=0;
while(!v[l].size()>=3){
if(v[l][0].first==k){
res1.push_back(v[l][1].second);
res.push_back(v[l][1].second);
k=l;
l=v[l][1].first;
}
else{
res1.push_back(v[l][0].second);
res.push_back(v[l][0].second);
k=l;
l=v[l][0].first;
}
}
ll a=-1, b=-1;
for(i=0; i<v[l].size(); i++){
if(v[l][i].first!=k){
if(a==-1) a=v[l][i].second;
else b=v[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;
}
}
}