Submission #1249727

#TimeUsernameProblemLanguageResultExecution timeMemory
1249727flashmtWorld Map (IOI25_worldmap)C++20
0 / 100
18 ms2628 KiB
#include "worldmap.h"
#include <bits/stdc++.h>
#ifdef LOCAL
#include "Debug.h"
#else
#define debug(...) 42
#endif
using namespace std;

struct DisjointSet
{
  int n;
  vector<int> ds, sz;

  DisjointSet(int n): n(n)
  {
    ds = sz = vector<int>(n);
    for (int i = 0; i < n; i++)
    {
      ds[i] = i;
      sz[i] = 1;
    }
  }

  int get(int x)
  {
    return x == ds[x] ? x : ds[x] = get(ds[x]);
  }

  int join(int x, int y)
  {
    int dx = get(x), dy = get(y);
    if (dx == dy)
      return 0;
    if (sz[dx] < sz[dy])
      swap(dx, dy);
    ds[dy] = dx;
    sz[dx] += sz[dy];
    return 1;
  }
};

const int N = 44;

vector<int> a[N];
int depth[N];

void dfs(int x, vector<int> &path)
{
  path.push_back(x);
  for (int y : a[x])
    if (depth[y] < 0 && size(a[y]) >= 2)
    {
      depth[y] = depth[x] + 1;
      dfs(y, path);
      path.push_back(x);
    }
}

vector<vector<int>> create_map(int n, int m, vector<int> A, vector<int> B) {
  for (int &x : A)
    x--;
  for (int &x : B)
    x--;
  for (int i = 0; i < n; i++)
  {
    a[i].clear();
    depth[i] = -1;
  }

  DisjointSet ds(n);
  for (int i = 0; i < m; i++)
    if (ds.join(A[i], B[i]))
    {
      a[A[i]].push_back(B[i]);
      a[B[i]].push_back(A[i]);
    }

  int root = -1;
  for (int i = 0; i < n; i++)
    if (size(a[i]) >= 2)
    {
      root = i;
      break;
    }

  if (root < 0)
  {
    assert(n == 2);
    return {
      {1, 1},
      {2, 2}
    };
  }

  vector<int> path;
  depth[root] = 0;
  dfs(root, path);

  // trim unnecessary backward edges
  while (size(path) >= 2)
  {
    int x = path[size(path) - 2], y = path[size(path) - 1];
    if (depth[x] < depth[y])
      break;
    path.pop_back();
  }

  int len = size(path);
  int k = max(n * 2, len * 2);
  debug(path); debug(k);
  vector<vector<int>> ans(k, vector<int>(k, -1));
  for (int i = 0; i < len; i++)
  {
    int x = path[i];
    if (i % 2 == 0)
    {
      for (int row = 0; row < k; row++)
        if (row % 2 == 0) ans[row][i * 2] = x;
        else
        {
          ans[row][i * 2 + 1] = x;
          if (i)
            ans[row][i * 2 - 1] = x;
        }

      for (int row = 1; row < k; row += 2)
        if (row / 2 < size(a[x])) ans[row][i * 2] = a[x][row / 2];
        else ans[row][i * 2] = x;
    }
    else
    {
      for (int row = 0; row < k; row++)
        if (row % 2) ans[row][i * 2] = x;
        else ans[row][i * 2 - 1] = ans[row][i * 2 + 1] = x;

      for (int row = 0; row < k; row += 2)
        if (row / 2 < size(a[x])) ans[row][i * 2] = a[x][row / 2];
        else ans[row][i * 2] = x;
    }
  }

  for (int i = 0; i < k; i++)
    for (int &x : ans[i])
      if (x < 0) x = path.back() + 1;
      else x++;
  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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...