Submission #376049

#TimeUsernameProblemLanguageResultExecution timeMemory
376049WLZDreaming (IOI13_dreaming)C++14
100 / 100
139 ms26812 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; int cur_cc = 0; vector< vector< pair<int, int> > > g; vector<int> cc, d, mn, mx, diameter; void dfs1(int u, int p) { cc[u] = cur_cc; for (auto& v : g[u]) { if (v.first != p) { d[v.first] = d[u] + v.second; dfs1(v.first, u); } } mx[u] = d[u]; vector<int> tmp = {0, 0}; for (auto& v : g[u]) { mx[u] = max(mx[u], mx[v.first]); tmp.push_back(mx[v.first]); } sort(tmp.rbegin(), tmp.rend()); diameter[cc[u]] = max(diameter[cc[u]], tmp[0] + tmp[1] - 2 * d[u]); } void dfs2(int u, int p, int len) { multiset<int> st; for (auto& v : g[u]) { if (v.first != p) { st.insert(mx[v.first]); } } for (auto& v : g[u]) { if (v.first != p) { st.erase(mx[v.first]); dfs2(v.first, u, max(len, (st.empty() ? 0 : *st.rbegin() - d[u])) + v.second); st.insert(mx[v.first]); } } mn[cc[u]] = min(mn[cc[u]], max(len, mx[u] - d[u])); } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { g.resize(N); for (int i = 0; i < M; i++) g[A[i]].push_back({B[i], T[i]}); for (int i = 0; i < M; i++) g[B[i]].push_back({A[i], T[i]}); d.assign(N, 0); cc.assign(N, -1); mx.resize(N); for (int i = 0; i < N; i++) { if (cc[i] == -1) { diameter.push_back(0); dfs1(i, -1); cur_cc++; } } mn.assign(cur_cc, INF); for (int i = 0; i < N; i++) { if (mn[cc[i]] == INF) dfs2(i, -1, 0); } sort(mn.begin(), mn.end()); int tmp = *max_element(diameter.begin(), diameter.end()); if (cur_cc == 1) return tmp; if (cur_cc == 2) return max(tmp, mn[0] + mn[1] + L); return max({tmp, mn[cur_cc - 2] + mn[cur_cc - 3] + 2 * L, mn[cur_cc - 1] + mn[cur_cc - 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...