Submission #829763

#TimeUsernameProblemLanguageResultExecution timeMemory
829763MilosMilutinovicAirline Route Map (JOI18_airline)C++14
100 / 100
410 ms29432 KiB
#include "Alicelib.h"
#include <bits/stdc++.h>

using namespace std;

void Alice(int n, int m, int a[], int b[]) {
  vector<pair<int, int>> e;
  for (int i = 0; i < m; i++) {
    e.emplace_back(a[i], b[i]);
  }
  const int L = 10;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < L; j++) {
      if ((i + 1) >> j & 1) {
        e.emplace_back(i, n + j);
      }
    }
  }
  int to_all = n + L;
  int to_bits = to_all + 1;
  for (int i = 0; i < to_all; i++) {
    e.emplace_back(i, to_all);
  }
  for (int i = n; i < n + L; i++) {
    e.emplace_back(to_bits, i);
  }

  auto Idx = [&](int x) {
    return n + x;
  };

  e.emplace_back(Idx(0), Idx(1));
  e.emplace_back(Idx(1), Idx(2));
  e.emplace_back(Idx(0), Idx(3));
  e.emplace_back(Idx(3), Idx(4));
  e.emplace_back(Idx(4), Idx(5));
  e.emplace_back(Idx(0), Idx(6));
  e.emplace_back(Idx(6), Idx(7));
  e.emplace_back(Idx(7), Idx(8));
  e.emplace_back(Idx(8), Idx(9));

  InitG(to_bits + 1, e.size());
  for (int i = 0; i < (int) e.size(); i++) {
    MakeG(i, e[i].first, e[i].second);
  }
}

/*
4 3
0 1
0 2
0 3

5 7
0 1
0 2
1 3
1 4
3 4
2 3
2 4
*/

#include "Boblib.h"
#include <bits/stdc++.h>

using namespace std;

void Bob(int v, int u, int c[], int d[]) {
  const int L = 10;
  int n = v - L - 2;
  vector<vector<int>> g(v);
  for (int i = 0; i < u; i++) {
    g[c[i]].push_back(d[i]);
    g[d[i]].push_back(c[i]);
  }
  vector<int> deg(v);
  for (int i = 0; i < v; i++) {
    deg[i] = (int) g[i].size();
  }
  int to_all = (int) (max_element(deg.begin(), deg.end()) - deg.begin());
  int to_bits = -1;
  for (int i = 0; i < v; i++) {
    if (i == to_all) {
      continue;
    }
    bool ok = true;
    for (int j : g[i]) {
      if (j == to_all) {
        ok = false;
      }
    }
    if (ok) {
      assert(to_bits == -1);
      to_bits = i;
    }
  }
  vector<int> bits;
  for (int i : g[to_bits]) {
    bits.push_back(i);
  }
  vector<int> nodes;
  vector<bool> is_node(v);
  for (int i = 0; i < v; i++) {
    if (i == to_all) {
      continue;
    }
    if (i == to_bits) {
      continue;
    }
    bool is_bit = false;
    for (int j : bits) {
      if (i == j) {
        is_bit = true;
      }
    }
    if (is_bit) {
      continue;
    }
    nodes.push_back(i);
    is_node[i] = true;
  }

  vector<int> val(v, -1);
  {
    vector<bool> is_bit(v);
    for (int i : bits) {
      is_bit[i] = true;
    }
    vector<vector<int>> r(v);
    for (int i = 0; i < u; i++) {
      if (is_bit[c[i]] && is_bit[d[i]]) {
        r[c[i]].push_back(d[i]);
        r[d[i]].push_back(c[i]);
      }
    }
    int cen = -1;
    for (int i : bits) {
      if ((int) r[i].size() == 3) {
        cen = i;
      }
    }
    val[cen] = 0;
    vector<int> ch;
    function<void(int, int)> Dfs = [&](int x, int pr) {
      if (x != cen) {
        ch.push_back(x);
      }
      for (int y : r[x]) {
        if (y == pr) {
          continue;
        }
        Dfs(y, x);
        if (x == cen) {
          if ((int) ch.size() == 2) {
            val[ch[0]] = 1;
            val[ch[1]] = 2;
          } else if ((int) ch.size() == 3) {
            val[ch[0]] = 3;
            val[ch[1]] = 4;
            val[ch[2]] = 5;
          } else if ((int) ch.size() == 4) {
            val[ch[0]] = 6;
            val[ch[1]] = 7;
            val[ch[2]] = 8;
            val[ch[3]] = 9;
          }
          ch.clear();
        }
      }
    };
    Dfs(cen, cen);
  }

  vector<int> idx(v);
  for (int i : nodes) {
    for (int j : g[i]) {
      if (val[j] != -1) {
        idx[i] += (1 << val[j]);
      }
    }
  }
  vector<pair<int, int>> ans;
  for (int i = 0; i < u; i++) {
    if (is_node[c[i]] && is_node[d[i]]) {
      ans.emplace_back(idx[c[i]], idx[d[i]]);
    }
  }
  InitMap(n, (int) ans.size());
  for (int i = 0; i < (int) ans.size(); i++) {
    MakeMap(ans[i].first - 1, ans[i].second - 1);
  }
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...