Submission #824759

#TimeUsernameProblemLanguageResultExecution timeMemory
824759tch1cherinVillage (BOI20_village)C++17
100 / 100
112 ms20512 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAX_N = 1e5 + 5;
const int MAX_L = __lg(MAX_N) + 1;
int up[MAX_L][MAX_N];
vector<int> G[MAX_N];
int depth[MAX_N], small[MAX_N], large[MAX_N];
vector<int> ord;

void DFS(int u, int p) {
  depth[u] = (u == 0 ? 0 : depth[p] + 1);
  ord.push_back(u);
  up[0][u] = p;
  for (int i = 0; i < MAX_L - 1; i++) {
    up[i + 1][u] = up[i][up[i][u]];
  }
  for (int v : G[u]) {
    if (v != p) {
      DFS(v, u);
    }
  }
  if (small[u] == u) {
    swap(small[u], small[u == 0 ? G[u][0] : p]);
  }
}

int lca(int u, int v) {
  if (depth[u] < depth[v]) {
    swap(u, v);
  }
  for (int i = MAX_L - 1; i >= 0; i--) {
    if (depth[u] - depth[v] >= (1 << i)) {
      u = up[i][u];
    }
  }
  if (u == v) {
    return u;
  }
  for (int i = MAX_L - 1; i >= 0; i--) {
    if (up[i][u] != up[i][v]) {
      u = up[i][u];
      v = up[i][v];
    }
  }
  return up[0][u];
}

int distance(int u, int v) {
  return depth[u] + depth[v] - 2 * depth[lca(u, v)];
}

int main() {
  cin.tie(nullptr)->sync_with_stdio(false);
  int N;
  cin >> N;
  for (int i = 0; i < N - 1; i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  iota(small, small + N, 0);
  DFS(0, 0);
  for (int i = 0; i < N; i++) {
    large[ord[i]] = ord[(i + N / 2) % N];
  }
  int64_t smallest = 0, largest = 0;
  for (int i = 0; i < N; i++) {
    smallest += distance(i, small[i]);
    largest += distance(i, large[i]);
  }
  cout << smallest << " " << largest << "\n";
  for (int i = 0; i < N; i++) {
    cout << 1 + small[i] << " \n"[i + 1 == N];
  }
  for (int i = 0; i < N; i++) {
    cout << 1 + large[i] << " \n"[i + 1 == N];
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...