Submission #1277351

#TimeUsernameProblemLanguageResultExecution timeMemory
1277351crispxxDreaming (IOI13_dreaming)C++20
100 / 100
78 ms25284 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() #define pb push_back #define ar array template <typename A, typename B> bool chmin(A &a, const B &b) { if(a > b) { return a = b, true; } return false; } template <typename A, typename B> bool chmax(A &a, const B &b) { if(a < b) { return a = b, true; } return false; } int travelTime(int n, int m, int l, int A[], int B[], int T[]) { vector<vector<ar<int, 2>>> adj(n); // cout << n << ' ' << m << ' ' << l << endl; for(int i = 0; i < m; i++) { // cout << i << endl; adj[A[i]].pb({B[i], T[i]}); adj[B[i]].pb({A[i], T[i]}); } vector<int> used(n), mx(n), mx2(n), d(n); auto dfs = [&](auto &&self, int v) -> void { used[v] = true; mx[v] = d[v]; for(auto [to, w] : adj[v]) { if(used[to]) continue; d[to] = d[v] + w; self(self, to); chmax(mx2[v], mx[to]); if(mx2[v] > mx[v]) swap(mx2[v], mx[v]); } }; for(int i = 0; i < n; i++) { // cout << i << endl; if(!used[i]) { dfs(dfs, i); } } fill(all(used), false); vector<int> mx_root(n); int mn = 1e9, ver = -1; auto dfs2 = [&](auto &&self, int v) -> void { used[v] = true; int res = max(mx_root[v], mx[v] - d[v]); if(chmin(mn, res)) ver = v; for(auto [to, w] : adj[v]) { if(used[to]) continue; chmax(mx_root[to], mx_root[v] + w); int val = mx[v]; if(val == mx[to]) val = mx2[v]; chmax(mx_root[to], (val - d[v]) + w); self(self, to); } }; auto nadj = adj; vector<ar<int, 2>> b; for(int i = 0; i < n; i++) { if(!used[i]) { mn = 1e9; ver = -1; dfs2(dfs2, i); b.pb({mn, ver}); } } sort(all(b), greater<>()); for(int i = 1; i < (int)b.size(); i++) { nadj[b[0][1]].pb({b[i][1], l}); nadj[b[i][1]].pb({b[0][1], l}); } fill(all(mx), 0); fill(all(mx2), 0); fill(all(d), 0); fill(all(mx_root), 0); fill(all(used), false); int ans = 0; auto ndfs = [&](auto &&self, int v) -> void { used[v] = true; mx[v] = d[v]; for(auto [to, w] : nadj[v]) { if(used[to]) continue; d[to] = d[v] + w; self(self, to); chmax(mx2[v], mx[to]); if(mx2[v] > mx[v]) swap(mx2[v], mx[v]); } }; ndfs(ndfs, 0); fill(all(used), false); auto ndfs2 = [&](auto &&self, int v) -> void { used[v] = true; int res = max(mx_root[v], mx[v] - d[v]); chmax(ans, res); for(auto [to, w] : nadj[v]) { if(used[to]) continue; chmax(mx_root[to], mx_root[v] + w); int val = mx[v]; if(val == mx[to]) val = mx2[v]; chmax(mx_root[to], (val - d[v]) + w); self(self, to); } }; ndfs2(ndfs2, 0); 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...