Submission #293418

#TimeUsernameProblemLanguageResultExecution timeMemory
293418rama_pangFun Tour (APIO20_fun)C++14
100 / 100
371 ms20376 KiB
#include "fun.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> createFunTour(int N, int Q) {
  auto Centroid = [&]() {
    int val = -1, res = -1;
    for (int i = 0; i < N; i++) {
      int q = attractionsBehind(0, i);
      if ((N - q) * 2 <= N) {
        if (val <= N - q) {
          val = N - q;
          res = i;
        }
      }
    }
    assert(res != -1);
    return res;
  };

  int u = Centroid();
  vector<int> other;
  vector<int> dist(N);
  for (int i = 0; i < N; i++) {
    dist[i] = hoursRequired(u, i);
    if (i != u) {
      other.emplace_back(i);
    }
  }
  sort(begin(other), end(other), [&](int i, int j) {
    return dist[i] < dist[j];
  });
  int zero = 0;
  while (zero + 1 < N && dist[other[zero]] == 1) {
    zero++;
  }
  assert(zero <= 3);
  vector<vector<int>> sub(zero);
  for (int i = 0; i < zero; i++) {
    sub[i].emplace_back(other[i]);
    assert(attractionsBehind(u, other[i]) * 2 <= N);
  }
  for (int i = zero; i + 1 < N; i++) {
    int v = other[i];
    bool inserted = false;
    for (int z = 0; z + 1 < zero; z++) {
      if (!inserted && 1 + hoursRequired(sub[z][0], v) == dist[v]) {
        assert(!inserted);
        inserted = true;
        sub[z].emplace_back(v);
      }
    }
    if (!inserted) {
      sub.back().emplace_back(v);
    }
  }

  int last = -1;
  vector<int> res;
  while (res.size() < N) {
    array<int, 3> mx = {-1, -1, -1}; // (dist, size, id)
    int total = 0;
    for (int i = 0; i < (int) sub.size(); i++) {
      total += sub[i].size();
    }
    static int big = -1;
    for (int i = 0; i < (int) sub.size(); i++) {
      if (big == -1 && 2 * sub[i].size() >= total) {
        int allmx = -1;
        for (int j = 0; j < (int) sub.size(); j++) {
          if (!sub[j].empty()) {
            allmx = max(allmx, dist[sub[j].back()]);
          }
        }
        if (last == -1 || sub[i].empty() || dist[sub[last].back()] == allmx || dist[sub[i].back()] == allmx) {
          big = i;
        }
      }
    }
    for (int i = 0; i < (int) sub.size(); i++) {
      if (i != last && !sub[i].empty()) {
        mx = max(mx, {dist[sub[i].back()], (int) sub[i].size(), i});
      }
    }
    if (big != -1 && last != big) {
      if (sub[big].empty()) {
        mx[2] = -1;
      } else {
        mx[2] = big;
      }
    }
    if (mx[2] == -1) {
      res.emplace_back(u);
    } else {
      res.emplace_back(sub[mx[2]].back());
      sub[mx[2]].pop_back();
    }
    last = mx[2];
  }

  return res;
}

Compilation message (stderr)

fun.cpp: In function 'std::vector<int> createFunTour(int, int)':
fun.cpp:60:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   60 |   while (res.size() < N) {
      |          ~~~~~~~~~~~^~~
fun.cpp:68:42: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   68 |       if (big == -1 && 2 * sub[i].size() >= total) {
      |                        ~~~~~~~~~~~~~~~~~~^~~~~~~~
#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...