#include "highway.h"
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
vector<vector<pii>> G;
vector<int> dist(int N, int v) {
vector<bool> vis(N);
vector<int> dist(N);
queue<pii> q;
q.push({v, 0});
while (!q.empty()) {
auto [v,d] = q.front();
q.pop();
if (vis[v])
continue;
vis[v] = true;
dist[v] = d;
for (auto [u, i] : G[v])
if (!vis[u]) q.push({u, d + 1});
}
return dist;
}
void find_pair(int N, vector<int> U, vector<int> V, int A, int B) {
assert(U.size() == V.size());
int M = U.size();
G.resize(N);
for (int i = 0; i < M; i++)
G[U[i]].push_back({V[i], i}), G[V[i]].push_back({U[i], i});
vector<int> w(M);
long long base = ask(w);
int l = 0, r = M - 1, a = 0;
while (l <= r) {
int m = (l + r) / 2;
w = vector<int>(M);
for (int i = 0; i < M; i++)
w[i] = i < m;
if (ask(w) == base)
a = m, l = m + 1;
else
r = m - 1;
}
vector<int> p;
array d = {dist(N, U[a]), dist(N, V[a])};
for (int v : {U[a], V[a]}) {
vector<int> ord;
for (int i = 0; i < N; i++)
if (d[0][i] < d[1][i])
ord.push_back(i);
sort(ord.begin(), ord.end(), [&](int i, int j) {
return d[0][i] > d[0][j];
});
int cur = 0;
l = 0, r = ord.size() - 1;
while (l <= r) {
int m = (l + r) / 2;
w = vector<int>(M);
for (int i = 0; i < a; i++)
w[i] = 1;
for (int i = 0; i < m; i++) {
for (auto [u, idx] : G[ord[i]])
w[idx] = 1;
}
if (ask(w) == base)
l = m + 1, cur = ord[m];
else
r = m - 1;
}
swap(d[0], d[1]);
p.push_back(cur);
}
answer(p[0], p[1]);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |