Submission #978875

#TimeUsernameProblemLanguageResultExecution timeMemory
978875badontDreaming (IOI13_dreaming)C++17
100 / 100
64 ms16144 KiB
#include "dreaming.h"
#include <algorithm>
#include <vector>

using namespace std;
using ll = long long;
using pii = pair<ll, ll>;

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
  ll n = N, m = M, l = L;
  vector e(n, vector<pii>());

  vector<int> par(n, -1);
  vector<bool> v(n, false);
  vector<ll> dist(n, 0);

  for (int i = 0; i < m; i++) {
    e[A[i]].push_back({B[i], T[i]});
    e[B[i]].push_back({A[i], T[i]});
  }

  ll ans = 0;
  vector<ll> a;
  for (int c = 0; c < n; c++) {
    if (v[c])
      continue;

    vector<ll> comp;
    bool push_comp = true;
    auto dfs_1 = [&](auto &dfs, int g, int p, ll d) -> void {
      dist[g] = d;
      v[g] = true;
      par[g] = p;
      if (push_comp) {
        comp.push_back(g);
      }
      for (auto [u, xd] : e[g]) {
        if (u == p)
          continue;
        dfs(dfs, u, g, d + xd);
      }
    };
    dfs_1(dfs_1, c, -1, 0);
    ll max_dist = 0, root = c;
    for (auto u : comp) {
      if (dist[u] > max_dist) {
        max_dist = dist[u];
        root = u;
      }
    }
    push_comp = false;
    dfs_1(dfs_1, root, -1, 0);
    max_dist = 0;
    int root_2 = root;
    for (auto u : comp) {
      if (dist[u] > max_dist) {
        max_dist = dist[u];
        root_2 = u;
      }
    }

    int cur = root_2;
    ll h = max_dist;
    while (par[cur] != -1) {
      ll d1 = dist[cur], d2 = max_dist - dist[cur];
      h = min(h, max(d1, d2));
      cur = par[cur];
    }
    ans = max(ans, max_dist);
    a.push_back(h);
  }
  sort(a.begin(), a.end(), greater<ll>());
  if ((int)a.size() >= 2) {
    ans = max(ans, a[0] + a[1] + L);
  }
  if ((int)a.size() >= 3) {
    ans = max(ans, a[1] + a[2] + 2 * L);
  }
  return ans;
}

Compilation message (stderr)

dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:10:20: warning: unused variable 'l' [-Wunused-variable]
   10 |   ll n = N, m = M, l = L;
      |                    ^
#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...