Submission #1058948

#TimeUsernameProblemLanguageResultExecution timeMemory
1058948MrDogMeatDreaming (IOI13_dreaming)C++17
100 / 100
38 ms17112 KiB
#include<bits/stdc++.h> #include "dreaming.h" using namespace std; #define FI first #define SE second const int MAX_N = 1e5 + 5; ///graph traverse vector<pair<int, int>> adj[MAX_N]; ///cal min longest path for each tree bool use[MAX_N]; pair<int, int> f[MAX_N]; int Min; ///cal ans vector<int> vec; int Ans; void maximize_pair(pair<int,int> &a, int v) { if(v > a.FI) { a.SE = a.FI; a.FI = v; } else if(v > a.SE) { a.SE = v; } } void dfs1(int u, int par) { use[u] = 1; for(auto v : adj[u]) if(v.FI != par) { dfs1(v.FI, u); maximize_pair(f[u], f[v.FI].FI + v.SE); } } void reroot(int u, int par) { Min = min(Min, f[u].FI); Ans = max(Ans, f[u].FI + f[u].SE); for(auto v : adj[u]) if(v.FI != par) { if(f[v.FI].FI + v.SE == f[u].FI) { maximize_pair(f[v.FI], f[u].SE + v.SE); } else { maximize_pair(f[v.FI], f[u].FI + v.SE); } reroot(v.FI, u); } } void cal(int u) { dfs1(u, 0); Min = INT_MAX; reroot(u, 0); vec.push_back(Min); } 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]); } Ans = 0; for(int u = 0; u < N; u++) if(!use[u]) { cal(u); } if(vec.size() == 2) { Ans = max(Ans, vec[0] + vec[1] + L); } else if(vec.size() > 2) { sort(vec.begin(), vec.end()); reverse(vec.begin(), vec.end()); Ans = max(Ans, max(vec[0] + vec[1] + L, vec[1] + vec[2] + 2 * L)); } 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...