Submission #778121

#TimeUsernameProblemLanguageResultExecution timeMemory
778121NeroZeinHighway Tolls (IOI18_highway)C++17
5 / 100
194 ms262144 KiB
#include "highway.h" #include "bits/stdc++.h" using namespace std; int n, m; vector<int> pe; vector<int> dep; vector<vector<pair<int,int>>> g; void Dfs (int v, int p) { for (auto [u, i] : g[v]) { if (u == p) { continue; } pe[u] = i; dep[u] = dep[v] + 1; Dfs(u, v); } } void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { n = N; g.resize(n); pe.resize(n); dep.resize(n); m = (int) U.size(); for (int i = 0; i < m; ++i) { g[U[i]].push_back({V[i], i}); g[V[i]].push_back({U[i], i}); } Dfs(0, 0); vector<int> vec; vector<int> w(m, 0); int dis = ask(w); int depT = dis / A; assert(depT != 0); for (int i = 0; i < n; ++i) { if (dep[i] == depT) { vec.push_back(i); } } auto fix = [&](vector<int> nodes) { vector<int> ret(m); for (int u : nodes) { assert(u != 0); ret[pe[u]] = true; } return ret; }; while (vec.size() > 1) { vector<int> lx, rx; int mid = (int) vec.size() / 2; for (int i = 0; i < mid; ++i) { lx.push_back(vec[i]); } for (int i = mid; i < (int) vec.size(); ++i) { rx.push_back(vec[i]); } if (ask(fix(lx)) > dis) { vec = lx; } else { vec = rx; } } assert(!vec.empty()); answer(0, vec[0]);//S, T }
#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...