Submission #1209408

#TimeUsernameProblemLanguageResultExecution timeMemory
1209408kunzaZa183Dreaming (IOI13_dreaming)C++20
100 / 100
93 ms29256 KiB
#include "dreaming.h"

#include <bits/stdc++.h>
using namespace std;

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
  vector<vector<pair<int, int>>> vvi(N);
  for (int i = 0; i < M; i++)
    vvi[A[i]].push_back({B[i], T[i]}), vvi[B[i]].push_back({A[i], T[i]});

  vector<int> dp(N);
  vector<bool> visi(N);

  function<int(int)> fii = [&](int cur) -> int {
    if (visi[cur]) return -1e9;
    visi[cur] = 1;

    for (auto& a : vvi[cur]) {
      dp[cur] = max(dp[cur], fii(a.first) + a.second);
    }

    return dp[cur];
  };

  for (int i = 0; i < N; i++) {
    fii(i);
  }

  vector<int> dp2(N);
  visi.assign(N, 0);
  function<void(int, int)> fii2 = [&](int cur, int up) {
    if (visi[cur]) return;
    visi[cur] = 1;
    dp2[cur] = up;

    multiset<int> si = {up};

    for (auto a : vvi[cur]) {
      if (visi[a.first] == 1) continue;
      si.insert(a.second + dp[a.first]);
    }

    for (auto a : vvi[cur]) {
      if (visi[a.first] == 1) continue;
      si.erase(si.find(a.second + dp[a.first]));

      fii2(a.first, a.second + *si.rbegin());

      si.insert(a.second + dp[a.first]);
    }
  };

  for (int i = 0; i < N; i++) {
    fii2(i, 0);
  }

  vector<int> compo(N, -1);
  function<void(int, int)> fii3 = [&](int cur, int comp) {
    if (compo[cur] != -1) return;
    compo[cur] = comp;
    for (auto a : vvi[cur]) fii3(a.first, comp);
  };
  int cur = 0;
  for (int i = 0; i < N; i++) {
    if (compo[i] == -1) fii3(i, cur++);
  }

  vector<int> all(cur, 1e9);
  for (int i = 0; i < N; i++) {
    all[compo[i]] = min(all[compo[i]], max(dp[i], dp2[i]));
  }
  sort(all.rbegin(), all.rend());

  int biggest = max(*max_element(dp.begin(), dp.end()),
                    *max_element(dp2.begin(), dp2.end()));

  if (cur == 1) {
    return max(biggest, all[0]);
  } else if (cur == 2) {
    return max(biggest, all[0] + all[1] + L);
  } else {
    return max({biggest, all[0] + all[1] + L, all[1] + all[2] + 2 * 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...