Submission #1316949

#TimeUsernameProblemLanguageResultExecution timeMemory
1316949ericl23302Dreaming (IOI13_dreaming)C++20
100 / 100
139 ms29052 KiB
#include "dreaming.h" #include <algorithm> #include <iostream> #include <queue> #include <utility> #include <vector> using namespace std; void getMaxDist(int cur, int par, vector<vector<pair<int, int> > > &adjacency, vector<int> &maxDist, vector<bool> &visited) { visited[cur] = true; for (auto &[nxt, len] : adjacency[cur]) { if (nxt == par) continue; getMaxDist(nxt, cur, adjacency, maxDist, visited); maxDist[cur] = max(maxDist[cur], maxDist[nxt] + len); } } int minDist(int cur, int par, int parMaxDist, vector<vector<pair<int, int> > > &adjacency, vector<int> &maxDist) { vector<pair<int, pair<int, int> > > dists; dists.push_back(make_pair(0, make_pair(-1, -1))); for (auto &[nxt, len] : adjacency[cur]) { if (nxt == par) dists.push_back(make_pair(parMaxDist, make_pair(par, len))); else dists.push_back(make_pair(maxDist[nxt] + len, make_pair(nxt, len))); } sort(dists.rbegin(), dists.rend()); if (dists.size() == 1) return 0; if (dists[1].first + dists[0].second.second < dists[0].first) { return minDist(dists[0].second.first, cur, dists[1].first + dists[0].second.second, adjacency, maxDist); } return dists[0].first; } int maxDistWithIn(int cur, int par, vector<vector<pair<int, int> > > &adjacency, vector<int> &maxDist) { vector<int> dists(2, 0); int maxRes = 0; for (auto &[nxt, len] : adjacency[cur]) { if (nxt == par) continue; maxRes = max(maxRes, maxDistWithIn(nxt, cur, adjacency, maxDist)); dists.push_back(maxDist[nxt] + len); } sort(dists.rbegin(), dists.rend()); return max(maxRes, dists[0] + dists[1]); } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { vector<vector<pair<int, int> > > adjacency(N); for (int i = 0; i < M; ++i) { adjacency[A[i]].emplace_back(B[i], T[i]); adjacency[B[i]].emplace_back(A[i], T[i]); } vector<int> maxDist(N); vector<int> components; vector<bool> visited(N, false); int maxRes = 0; for (int i = 0; i < N; ++i) { if (visited[i]) continue; getMaxDist(i, -1, adjacency, maxDist, visited); components.push_back(minDist(i, -1, -1, adjacency, maxDist)); maxRes = max(maxRes, maxDistWithIn(i, -1, adjacency, maxDist)); } sort(components.rbegin(), components.rend()); if (components.size() == 1) return max(components[0], maxRes); else if (components.size() == 2) return max(components[0] + components[1] + L, maxRes); else return max(components[1] + max(components[0] + L, components[2] + 2 * L), maxRes); }
#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...