Submission #155665

#TimeUsernameProblemLanguageResultExecution timeMemory
155665rama_pang통행료 (IOI18_highway)C++14
5 / 100
397 ms262148 KiB
#include "highway.h" #include <bits/stdc++.h> using namespace std; using lint = long long; const lint MAXN = 150005; lint N, M, A, B; vector<int> G[MAXN]; lint dist[MAXN]; struct edge { int u, v, id; edge(int uu, int vv, int idd): u(uu), v(vv), id(idd) { } bool operator < (const edge &o) { return dist[v] < dist[o.v]; } }; vector<edge> E; void dfs(int n, int p, int d) { dist[n] = d; for (auto &i : G[n]) if (i != p) { dfs(i, n, d + 1); } } void find_pair(int _N, vector<int> U, vector<int> V, int _A, int _B) { N = _N, A = _A, B = _B, M = U.size(); for (int i = 0; i < M; i++) { G[U[i]].emplace_back(V[i]); G[V[i]].emplace_back(U[i]); E.emplace_back(U[i], V[i], i); } dfs(0, -1, 0); for (int i = 0; i < M; i++) { if (dist[E[i].u] > dist[E[i].v]) swap(E[i].u, E[i].v); } sort(E.begin(), E.end()); lint le = 0, ri = M - 1; lint ans = (dist[E.back().u] > dist[E.back().v])? E.back().u : E.back().v; vector<int> guess(M, 0); lint D = ask(guess) / A; while (le <= ri) { guess.assign(M, 0); lint mid = (le + ri) / 2; for (int i = 0; i <= mid; i++) guess[E[i].id] = 1; int check = ask(guess); // cout << le << " " << ri << " " << check << "\n"; if (check == D * B) { ans = mid; ri = mid - 1; } else { // ans = mid; le = mid + 1; } } // cout << ans << "\n"; ans = (dist[E[ans].u] == D)? E[ans].u : E[ans].v; answer(0, ans); } /* 4 4 1 3 1 3 0 1 0 2 0 3 1 2 4 3 1 3 0 1 0 1 0 2 0 3 4 3 1 3 0 1 0 1 0 3 1 2 */
#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...