Submission #1359303

#TimeUsernameProblemLanguageResultExecution timeMemory
1359303maya_sThousands Islands (IOI22_islands)C++20
1.75 / 100
14 ms4892 KiB
#include "islands.h"
#include<bits/stdc++.h>
using namespace std;
typedef int ll;

bool dfs(ll n, ll edge_idx, vector<bool> &vis, vector<vector<ll>> &g, vector<ll> &u, vector<ll> &v, vector<ll> &opposite_edge, vector<ll> &journey){
  vis[edge_idx] = 1;
  vector<ll> x;
  for(ll idx: g[n]) if(!vis[idx]) x.push_back(idx);
  if(x.size() == 0) return 0;
  if(x.size() == 1) {
    journey.push_back(x[0]);
    return dfs(v[x[0]], x[0], vis, g, u, v, opposite_edge, journey);
  }
  vector<ll> reversed_journey = journey;
  reverse(reversed_journey.begin(), reversed_journey.end());
  vector<ll> end_journey = {x[0], opposite_edge[x[0]], x[1], opposite_edge[x[1]], opposite_edge[x[0]], x[0], opposite_edge[x[1]], x[1]};
  for(ll i: end_journey) journey.push_back(i);
  for(ll i: reversed_journey) journey.push_back(i);
  return 1;
}

variant<bool, vector<int>> find_journey(int n, int m, vector<int> u, vector<int> v) {
  vector<vector<ll>> g(n);
  vector<ll> opposite_edge(m);
  for(ll i = 0; i < m; i++) {
    g[u[i]].push_back(i);
    if(i % 2 == 0) opposite_edge[i] = i+1;
    else opposite_edge[i] = i-1;
  }
  vector<ll> journey;
  vector<bool> vis(m+1);
  if(!dfs(0, m, vis, g, u, v, opposite_edge, journey)) return false;
  variant<bool, vector<int>> ans = (true, journey);
  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...