Submission #93680

#TimeUsernameProblemLanguageResultExecution timeMemory
93680antimirageHighway Tolls (IOI18_highway)C++14
5 / 100
216 ms32608 KiB
#include "highway.h" #include <bits/stdc++.h> #define fr first #define sc second #define mk make_pair #define pb push_back using namespace std; const int QWE = 1e5 + 5; int n, len, m, a, b, h[QWE]; vector < vector <pair <int, int> > > g; vector <int> w, u1, u2; vector <int> vec[QWE]; void dfs (int v, int level = 0, int p = -1) { h[v] = level; for (auto to : g[v]) { if (to.fr == p) continue; vec[level + 1].pb(to.sc); dfs(to.fr, level + 1, v); } } int Find(int root) { dfs(root); int l = -1, r = vec[len / a].size() - 1; while (r - l > 1) { int md = (l + r) >> 1; for (int i = 0; i < m; i++) w[i] = 0; for (int i = 0; i <= md; i++) w[ vec[len / a][i] ] = 1; if ( ask(w) != len ) r = md; else l = md; } if ( h[ u1[ vec[len / a][r] ] ] > h[ u2[ vec[len / a][r] ] ] ) return u1[ vec[len / a][r] ]; return u2[ vec[len / a][r] ]; } void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { u1 = U; u2 = V; a = A; b = B; n = N; g.resize(n + 1); m = U.size(); for (int j = 0; j < m; ++j) { w.pb(0); g[ U[j] ].pb( mk( V[j], j) ); g[ V[j] ].pb( mk( U[j], j) ); } len = ask(w); answer( 0, Find(0) ); } /** 4 3 1 3 0 3 0 1 0 2 0 3 **/
#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...