Submission #898517

#TimeUsernameProblemLanguageResultExecution timeMemory
898517OAleksaFun Tour (APIO20_fun)C++14
0 / 100
1 ms348 KiB
#include "fun.h"
#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;
vector<int> createFunTour(int N, int Q) {
  int n = N;
  int cen = 0;
  if (n == 2)
    return {0, 1};
  for (int i = 1;i < n;i++) {
    if (attractionsBehind(cen, i) > n / 2)
      cen = i;
  }
  vector<int> dis(n);
  for (int i = 0;i < n;i++) {
    if (i == cen)
      continue;
    dis[i] = hoursRequired(cen, i);
  }
  vector<int> p;
  for (int i = 0;i < n;i++) {
    if (dis[i] == 1) {
      p.push_back(i);
    }
  }
  int m = p.size();
  vector<int> ch[m];
  for (int i = 0;i < n;i++) {
    if (i == cen)
      continue;
    for (int j = 0;j < m;j++) {
      if (j == m - 1) {
        ch[j].push_back(i);
      }
      else {
        int x = hoursRequired(p[j], i);
        if (x + 1 == dis[i]) {
          ch[j].push_back(i);
          break;
        }
      }
    }
  }
  for (int i = 0;i < m;i++) {
    sort(ch[i].begin(), ch[i].end(), [&](int x, int y) {
      return dis[x] < dis[y];
    });
  }
  vector<int> ans;
  int lst = 0;
  if (m == 2) {
    if (ch[0].size() > ch[1].size())
      swap(ch[0], ch[1]);
    while (!ch[1].empty()) {
      if (lst == 0) {
        ans.push_back(ch[1].back());
        ch[1].pop_back();
        lst = 1;
      }
      else {
        ans.push_back(ch[0].back());
        ch[0].pop_back();
        lst = 0;
      }
    }
    if (!ch[0].empty()) { //jednake velicine
      assert(ch[0].size() == 1);
      ans.push_back(ch[0].back());
    }
  }
  else {
    auto Good = [&]() {
      int u = 0, mx = 0;
      for (int i = 0;i < m;i++) {
        mx = max(mx, (int)ch[i].size());
        u += ch[i].size();
      }
      return mx != u - mx;
    };
    while (Good()) {
      int mx = 0, node = -1;
      for (int j = 0;j < m;j++) {
        if (j == lst)
          continue;
        if (dis[ch[j].back()] > mx) {
          mx = dis[ch[j].back()];
          node = j;
        }
      }
      assert(node != -1);
      ans.push_back(ch[node].back());
      ch[node].pop_back();
      lst = node;
    }
    int big = 0;
    for (int i = 1;i < m;i++) {
      if (ch[i].size() > ch[big].size())
        big = i;
    }
    vector<int> sv;
    for (int i = 0;i < m;i++) {
      if (i == big)
        continue;
      for (auto u : ch[i])
        sv.push_back(u);
    }
    sort(sv.begin(), sv.end(), [&](int i, int j) {
      return dis[i] < dis[j];
    });
    while (!sv.empty()) {
      if (lst != big) {
        ans.push_back(ch[big].back());
        ch[big].pop_back();
        lst = big;
      }
      else {
        ans.push_back(sv.back());
        sv.pop_back();
        lst = -1;
      }
    }
  }
  ans.push_back(cen);
  return ans;
}
/*
7 400000
0 1
0 5
0 6
1 2
1 4
2 3
*/
#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...