제출 #764058

#제출 시각아이디문제언어결과실행 시간메모리
764058t6twotwo통행료 (IOI18_highway)C++17
51 / 100
142 ms16548 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; } } vector<int> p(N); iota(p.begin(), p.end(), 0); function<int(int)> find = [&](int x) { return x == p[x] ? x : p[x] = find(p[x]); }; auto unite = [&](int x, int y) { p[find(x)] = find(y); }; vector<int> W(M); for (int i = 0; i < M; i++) { if (find(U[i]) == find(V[i])) { W[i] = 1; } else { unite(U[i], V[i]); } } ll s = ask(W); if (subtask3) { int lo = 0, hi = N - 1; while (lo < hi) { int mi = (lo + hi + 1) / 2; vector<int> w(W); 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++) { if (W[i]) { continue; } adj[U[i]].emplace_back(V[i], i); adj[V[i]].emplace_back(U[i], i); } 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, 0, -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(W); for (int i = 0; i <= mi; i++) { w[t[v[d][i]]] = 1; } if (ask(w) != s) { hi = mi; } else { lo = mi + 1; } } int S = v[d][lo]; dep[S] = 0; dfs(dfs, S, -1); vector<int> q; for (int i = 0; i < N; i++) { if (dep[i] == s / A) { q.push_back(i); } } lo = 0, hi = q.size() - 1; while (lo < hi) { int mi = (lo + hi) / 2; vector<int> w(W); for (int i = 0; i <= mi; i++) { w[t[q[i]]] = 1; } if (ask(w) != s) { hi = mi; } else { lo = mi + 1; } } answer(S, q[lo]); }
#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...