제출 #764017

#제출 시각아이디문제언어결과실행 시간메모리
764017t6twotwoHighway Tolls (IOI18_highway)C++17
11 / 100
207 ms262144 KiB
#include "highway.h" #include <bits/stdc++.h> using namespace std; using ll = long long; void find_pair(int N, vector<int> U, vector<int> V, int A, int B) { int M = U.size(); bool subtask3 = M == N - 1; for (int i = 0; i < M; i++) { if (U[i] != i && V[i] != i + 1) { subtask3 = 0; } } ll s = ask(vector<int>(M)); if (subtask3) { int lo = 0, hi = N - 1; while (lo < hi) { int mi = (lo + hi + 1) / 2; vector<int> w(M); fill(w.begin(), w.begin() + mi, 1); if (ask(w) != s) { hi = mi - 1; } else { lo = mi; } } answer(lo, lo + s / A); return; } vector<vector<pair<int, int>>> adj(N); for (int i = 0; i < M; i++) { adj[U[i]].emplace_back(V[i], i); adj[V[i]].emplace_back(U[i], i); } auto F = [&](int R) { vector<int> dep(N), t(N); auto dfs = [&](auto dfs, int x, int p) -> void { for (auto [y, z] : adj[x]) { if (y == p) { continue; } t[y] = z; dep[y] = dep[x] + 1; dfs(dfs, y, x); } }; dfs(dfs, R, -1); vector<vector<int>> v(N); for (int i = 0; i < N; i++) { v[dep[i]].push_back(i); } int lo = 1, hi = N - 1; while (lo < hi) { int mi = (lo + hi) / 2; vector<int> w(M, 1); for (int i = 1; i <= mi; i++) { for (int x : v[i]) { w[t[x]] = 0; } } if (ask(w) == s) { hi = mi; } else { lo = mi + 1; } } int d = lo; lo = 0, hi = v[d].size() - 1; while (lo < hi) { int mi = (lo + hi) / 2; vector<int> w(M); for (int i = 0; i <= mi; i++) { w[t[v[d][i]]] = 1; } if (ask(w) != s) { hi = mi; } else { lo = mi + 1; } } return v[d][lo]; }; int S = F(0); int T = F(S); answer(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...