Submission #595211

#TimeUsernameProblemLanguageResultExecution timeMemory
595211shrimbDreaming (IOI13_dreaming)C++17
100 / 100
155 ms31304 KiB
#include "bits/stdc++.h" #include "dreaming.h" using namespace std; const int maxn = 100001; vector<pair<int,int>> adj[maxn]; /* answer can be: 1- biggest simple path which exists 2- 2 biggest path from roots + L 3- 2nd and 3rd biggest paths from roots + 2L */ int A1 = 0, A2 = 0, A3 = 0; int id = 1; int cmp[maxn]; int dist[maxn]; int distu[maxn]; void dfs (int cur, int par) { multiset<int> mx; for (auto [j, w] : adj[cur]) { if (!cmp[j]) { cmp[j] = id; dfs(j, cur); dist[cur] = max(dist[cur], dist[j] + w); mx.insert(dist[j] + w); if (mx.size() > 2) mx.erase(mx.begin()); if (mx.size() == 2) { A1 = max(A1, *mx.begin() + *++mx.begin()); } } } } void dfs2 (int cur, int par) { multiset<int> mxs; for (auto [j, w] : adj[cur]) { if (j != par) mxs.insert(dist[j] + w); } for (auto [j, w] : adj[cur]) { if (j != par) { int v = dist[j] + w; mxs.erase(mxs.find(v)); if (mxs.size()) distu[j] = max(distu[j], *--mxs.end() + w); distu[j] = max(distu[j], distu[cur] + w); mxs.insert(v); } } for (auto [j, w] : adj[cur]) { if (j != par) dfs2(j, cur); } } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { for (int i = 0 ; i < M ; i++) { adj[A[i]].emplace_back(B[i], T[i]); adj[B[i]].emplace_back(A[i], T[i]); } for (int i = 0 ; i < N ; i++) { if (cmp[i] == 0) { cmp[i] = id; dfs(i, -1); dfs2(i, -1); id++; } } int vals[id]; memset(vals, -1, sizeof vals); for (int i = 0 ; i < N ; i++) { // cerr << "debug dist[" << i << "]: " << dist[i] << endl; if (vals[cmp[i]] == -1) { vals[cmp[i]] = max(distu[i],dist[i]); } else { vals[cmp[i]] = min(vals[cmp[i]], max(distu[i],dist[i])); } } sort(vals + 1, vals + id, greater<int>()); if (id > 2) { A2 = vals[1] + vals[2] + L; } if (id > 3) { A3 = vals[2] + vals[3] + L + L; } return max({A1, A2, A3}); }
#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...