Submission #1318416

#TimeUsernameProblemLanguageResultExecution timeMemory
1318416ayazDreaming (IOI13_dreaming)C++20
47 / 100
49 ms9084 KiB
#pragma GCC optimize("O3")
#include "bits/stdc++.h"
#include "dreaming.h"

using namespace std;

vector<vector<array<int, 2>>> g;
vector<bool> used;
vector<int> dis1, dis2, nodes, par;
int n;

pair<int, int> findDiameter(int u) {
  queue<int> q;
  q.push(u);
  dis1[u] = 0;
  int start = u;
  while (!q.empty()) {
    auto v = q.front();
    q.pop();
    for (auto &[u, w] : g[v]) {
      if (dis1[u] == 1e9) {
        dis1[u] = dis1[v] + w;
        if (dis1[u] > dis1[start]) start = u;
        q.push(u);
      }
    }
  }
  q.push(start);
  dis2[start] = 0;
  par[start] = -1;
  int finish = start;
  while (!q.empty()) {
    auto v = q.front();
    q.pop();
    used[v] = 1;
    for (auto &[u, w] : g[v]) {
      if (dis2[u] == 1e9) {
        dis2[u] = dis2[v] + w;
        par[u] = v;
        if (dis2[u] > dis2[finish]) finish = u;
        q.push(u);
      }
    }
  }
  int mid = 1e9, nodeMid = 0;
  for (int v = finish; v != -1; v = par[v]) {
    int cur = max(dis2[v], dis2[finish]- dis2[v]);
    if (cur <= mid) {
      nodeMid = v;
      mid = cur;
    }
  }
  return {dis2[finish], nodeMid};
}
array<int, 2> findCenter(int u) {
  int ans = 1e9, cent;
  auto [diameter, mid] = findDiameter(u);
  return {dis2[mid], mid};
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
  int m = M, l = L;
  n = N;
  dis1.resize(n + 1, 1e9);
  dis2.resize(n + 1, 1e9);
  par.resize(n + 1, 0);
  g.resize(n + 1);
  used.assign(n + 1, false);
  for (int i = 0; i < m; i++) {
    int u = A[i], v = B[i], w = T[i];
    u++, v++;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
  }
  vector<array<int, 2>> mx;
  for (int u = 1; u <= n; u++) {
    if (used[u]) continue;
    mx.push_back(findCenter(u));
  }
  sort(mx.rbegin(), mx.rend());
  for (int i = 1; i < size(mx); i++) {
    g[mx[i][1]].push_back({mx[0][1], l});
    g[mx[0][1]].push_back({mx[i][1], l});
  }
  int ans = 0;
  fill(dis1.begin(), dis1.end(), 1e9);
  fill(dis2.begin(), dis2.end(), 1e9);
  ans = findDiameter(1).first;
  return ans;
}
#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...