Submission #1320266

#TimeUsernameProblemLanguageResultExecution timeMemory
1320266madamadam3Thousands Islands (IOI22_islands)C++20
6.75 / 100
120 ms14632 KiB
#include "islands.h"
#include <bits/stdc++.h>

using namespace std;

using vi = vector<int>;
using pi = pair<int, int>;

int n, m;
vector<vi> adj;
vi istate;

variant<bool, vi> find_journey(int N, int M, vi U, vi V) {
  n = N; m = M; istate.assign(n, 0); adj.resize(n);
  map<pi, int> ec;
  for (int i = 0; i < m; i++) {
    ec[{U[i], V[i]}]++;

    adj[U[i]].push_back(i);
    adj[V[i]].push_back(i);
  }

  auto find = [&](int u, int v, int skip = -1) {
    for (int i = 0; i < m; i++) {
      if (U[i] == u && V[i] == v && i != skip) return i;
    }

    return -1;
  };

  auto get_case1 = [&](int u, int p) {
    for (auto e : adj[u]) {
      int v = U[e] == u ? V[e] : U[e];
      if (v == p) continue;

      if (ec[{u, v}] >= 2 && ec[{v, u}] >= 1) {
        int a = find(u, v), c = find(v, u); int b = find(u, v, a);
        return vector<int>({a, c, b, a, c, b});
      }
    }

    return vector<int>({});
  };

  if (n == 2) {
    auto c1 = get_case1(0, -1);
    if (c1.empty()) return false;
    else return c1;
  }

  vector<int> pre, maneuver, post;
  set<int> vis;
  auto dfs_c1 = [&](auto &&self, int u, int p) {
    auto c1 = get_case1(u, p);
    if (!c1.empty()) {
      maneuver = c1;
      return true;
    }

    vis.insert(u);

    for (auto e : adj[u]) {
      int v = U[e] == u ? V[e] : U[e];
      if (v == p) continue;
      if (vis.count(v)) continue;

      if (self(self, v, u)) {
        post.push_back(e);
        return true;
      }
    }

    return false;
  };

  if (dfs_c1(dfs_c1, 0, -1)) {
    pre = post;
    reverse(pre.begin(), pre.end());
    for (auto &el : maneuver) pre.push_back(el);
    for (auto &el : post) pre.push_back(el);

    return pre;
  }

  int timer = 0;
  vis.clear(); vi tin(n+1, -1);
  auto dfs_c2 = [&](auto &&self, int u, int p) {
    vis.insert(u);
    tin[u] = timer++;

    for (auto e : adj[u]) {
      int v = U[e] == u ? V[e] : U[e];
      if (v == p) {
        if (ec[{u, v}] >= 2 && ec[{v, u}] >= 2) return true;
        else continue;
      }
      if (!(ec[{u, v}] > 0 && ec[{v, u}] > 0)) continue;
      if (vis.count(v)) {
        if (tin[v] < tin[u]) return true;
        else continue;
      }

      if (self(self, v, u)) {
        return true;
      }
    }

    return false;
  };

  if (dfs_c2(dfs_c2, 1, -1)) return true;

  // int a = find(0, 1), b = find(1, 0), c = find(1, 2), d = find(2, 1), e = find(2, 0), f = find(0, 2);
  // return vector<int>({a, c, e, f, d, b, e, c, a, b, d, f});
  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...