Submission #1320419

#TimeUsernameProblemLanguageResultExecution timeMemory
1320419madamadam3Thousands Islands (IOI22_islands)C++20
22.75 / 100
73 ms13676 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;

struct DSU {
  int n; vector<int> par;
  DSU(int N = 0) : n(N), par(N) {iota(par.begin(), par.end(), 0);}
  int find(int v) {return par[v] == v ? v : par[v] = find(par[v]);}
  void unite(int a, int b) {if (find(b) != find(a)) par[find(b)] = find(a);}
};

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;
  vi deg(n), indeg(n);
  for (int i = 0; i < m; i++) {
    ec[{U[i], V[i]}]++;

    deg[U[i]]++; indeg[V[i]]++;
    adj[U[i]].push_back(i);
    // adj[V[i]].push_back(i);
  }

  int x = 0, p = -1;
  vector<int> pre, maneuver;
  set<int> vis; vis.insert(0);
  if (deg[0] == 0) return false;

  if (deg[0] < 2) {
    pre.push_back(adj[0][0]);
    x = V[adj[0][0]]; p = 0;

    while (deg[x] < 3) {
      vis.insert(x);
      int y = -1; for (auto e : adj[x]) if (!vis.count(V[e])) {y = e; break;}
      if (y == -1) return false;
      pre.push_back(y);
      x = V[y];
    }
  }
  
  if (deg[x] <= (x == 0 ? 1 : 2)) return false;
  int a = -1, b = -1, c = -1, d = -1;
  for (auto e : adj[x]) {
    if (vis.count(V[e])) continue;
    if (a == -1) a = e;
    else if (c == -1) c = e;
  }

  if (a%2 == 0) b = a+1;
  else b = a-1;

  if (c%2 == 0) d = c+1;
  else d = c-1;

  // cout << x << "\n";
  // cout << a << " " << b << " " << c << " " << d << "\n";
  if (a < 0 || b < 0 || c < 0 || d < 0) return false;
  maneuver.assign({a,b,c,d,b,a,d,c});

  vector<int> post = pre; reverse(post.begin(), post.end());
  for (auto &el : maneuver) pre.push_back(el);
  for (auto &el : post) pre.push_back(el);

  return pre;
}
#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...