Submission #1240605

#TimeUsernameProblemLanguageResultExecution timeMemory
1240605madamadam3Sphinx's Riddle (IOI24_sphinx)C++20
3 / 100
24 ms412 KiB
#include "sphinx.h"
#include <bits/stdc++.h>

using namespace std;

using vi =vector<int>;
using vvi =vector<vi>;

#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define FOR(i, a, b) for (int i = a; i < b; i++)
#define all(x) (x).begin(), (x).end()
#define bg(x) (x).begin()
#define en(x) (x).end()
#define sz(x) int((x).size())
#define rev(x) reverse(all(x))
#define srt(x) sort(all(x))
#define each(a, x) for (auto &a : x)
#define trace(x) for (auto &el : x) cout << el << " "

struct DSU {
  int n; vi par, siz;
  DSU() {};
  DSU(int N) {
    n = N; siz.assign(n, 1);
    par.resize(n); iota(all(par), 0);
  } 

  int find(int v) {
    if (par[v] == v) return v;
    return par[v] = find(par[v]);
  }

  void unite(int a, int b) {
    a = find(a); b = find(b);
    if (a != b) {
      if (siz[b] > siz[a]) swap(a, b);
      par[b] = a; siz[a] += siz[b]; 
    }
  }
};

int n, m;
vi x, y;
vvi adj;

vi even_to(int x, int col) {
  vi to_ret(n, n);
  for (int i = 0; i < n; i+=2) to_ret[i] = -1;

  if (x == 0) {
    to_ret[2] = n;
    to_ret[1] = col;
  } else {
    for (int i = 0; i <= x; i++) {
      to_ret[2*i + 1] = col;
    }
  }

  return to_ret;
}

vi odd_to(int x, int col) {
  vi to_ret(n, n);
  for (int i = 1; i < n; i += 2) to_ret[i] = -1;
  FOR(i, 0, x+1) to_ret[2*i+1] = col;

  return to_ret;
}

int count_components(vi &graph) {
  int cmps = 0;
  vector<bool> seen(n, false);

  FOR(i, 0, n) {
    if (seen[i]) continue;
    seen[i] = true;

    queue<int> q; q.push(i);
    while (!q.empty()) {
      int cur = q.front();
      q.pop();

      for (auto &v : adj[cur]) {
        if (seen[v]) continue;
        if (graph[v] != graph[cur]) continue;
        seen[v] = true;
        q.push(v);
      }
    }

    cmps++;
  }
  return cmps;
}

vi find_colours(int N, vi X, vi Y) {
  n = N; m = sz(X); x = X; y = Y;
  adj.assign(n, vi());
  FOR(i, 0, m) adj[x[i]].pb(y[i]), adj[y[i]].pb(x[i]);

  vi graph(n, n); iota(graph.begin(), graph.end(), 0);
  if (n == 2) {
    graph[0] = perform_experiment({-1, 0}) == 1 ? 0 : 1;
    graph[1] = perform_experiment({0, -1}) == 1 ? 0 : 1;
    return graph;
  }

  auto dsu = DSU(n);
  FOR(i, 0, n-1) {
    vi test(n, n);
    test[i] = test[i+1] = -1;
    
    int perf = perform_experiment(test);
    if ((i == 0 || i == n - 2) && perf == 2) {
      dsu.unite(i, i+1);
    } else if (!(i == 0 || i == n - 2) && perf == 3) {
      dsu.unite(i, i+1);
    }
  }

  FOR(col, 0, n) {
    FOR(even_idx, 0, (n+1)/2) {
      vi even = even_to(even_idx, col);
      if (perform_experiment(even) != count_components(even)) {
        graph[dsu.find(2*even_idx)] = col;
      }
    }

    FOR(odd_idx, 0, n/2) {
      vi odd = odd_to(odd_idx, col);
      if (perform_experiment(odd) != count_components(odd)) {
        graph[dsu.find(2*odd_idx+1)] = col;
      }
    }
  }

  FOR(i, 0, n) {
    graph[i] = graph[dsu.find(i)];
  }

  return graph;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...