Submission #306518

#TimeUsernameProblemLanguageResultExecution timeMemory
306518tengiz05Dreaming (IOI13_dreaming)C++14
100 / 100
182 ms29432 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; int n; const int N = 1e5+5; bool used[N]; long long depth[N]; long long dp[N]; vector<pair<int, long long>> edges[N]; vector<long long> a[N]; // dfs for calculating dp. (dp[i] - maximum depth) void dfs(int u, int p){ used[u] = true; dp[u] = 0; a[u].push_back(0);a[u].push_back(0); for(auto X : edges[u]){ int v = X.first; long long cost = X.second; if(v == p)continue; dfs(v, u); dp[u] = max(dp[u], dp[v]+cost); a[u].push_back(dp[v]+cost); } sort(a[u].begin(), a[u].end()); reverse(a[u].begin(), a[u].end()); } //dfs for rerooting long long mn; void dfs2(int u, int p, long long T){ long long dpu = dp[u]; for(auto X : edges[u]){ int v = X.first; long long cost = X.second; if(v == p)continue; long long tmp = dp[v]; if(dp[v]+cost == a[u][0])dp[u] = a[u][1]; if(u != p)dp[u] = max(dp[u], dp[p] + T); dp[v] = max(dp[v], dp[u] + cost); mn = min(mn, dp[v]); dfs2(v, u, cost); dp[v] = tmp; dp[u] = dpu; } } //calculate best center for the tree long long calculate_center(int u){ dfs(u, u); mn = dp[u]; dfs2(u, u ,0); return mn; } int travelTime(int _N, int M, int L, int A[], int B[], int T[]) { n = _N; for(int i=0;i<M;i++){ edges[A[i]].push_back({B[i], T[i]}); edges[B[i]].push_back({A[i], T[i]}); } vector<long long> v; for(int i=0;i<n;i++){ if(!used[i]){ v.push_back(calculate_center(i)); } } sort(v.begin(), v.end()); reverse(v.begin(), v.end()); if(v.size() == 1){ long long m = 0; for(int i=0;i<n;i++){ m = max(m, a[i][0]+a[i][1]); } return m; } else { long long m = 0; for(int i=0;i<n;i++){ m = max(m, a[i][0]+a[i][1]); } return max(v[0]+v[1]+L, max(m, ((v.size()>=3)? v[1]+v[2]+2*L : 0ll))); } }
#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...