#include "highway.h"
#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define vi vector<int>
#define vvi vector<vector<int>>
#define pii pair<int, int>
#define vpii vector<pair<int, int>>
#define vc vector<char>
#define vb vector<bool>
#define mii map<int,int>
#define f0r(i,n) for(int i=0;i<n;i++)
#define FOR(i,k,n) for(int i=k;i<n;i++)
#define all(v) (v).begin(),(v).end()
#define rall(v) (v).rbegin(),(v).rend()
#define in(a) int a; cin>>a
#define in2(a,b) int a,b; cin>>a>>b
#define in3(a,b,c) int a,b,c; cin>>a>>b>>c
#define in4(a,b,c,d) int a,b,c,d; cin>>a>>b>>c>>d
#define vin(v,n); vi v(n); f0r(i,n){cin>>v[i];}
#define out(a) cout<<a<<'\n'
#define out2(a,b) cout<<a<<' '<<b<<'\n'
#define out3(a,b,c) cout<<a<<' '<<b<<' '<<c<<'\n'
#define out4(a,b,c,d) cout<<a<<' '<<b<<' '<<c<<' '<<d<<'\n'
#define pout(a) cout<<a.first<<' '<<a.second<<'\n'
#define vout(v) for(auto u : v){cout<<u<<' ';} cout<<'\n'
#define dout(a) cout<<a<<' '<<#a<<'\n'
#define dout2(a,b) cout<<a<<' '<<#a<<' '<<b<<' '<<#b<<'\n'
#define yn(x); if(x){cout<<"YES"<<'\n';}else{cout<<"NO"<<'\n';}
const int leg = 1e9 + 7;
const int mod = 998244353;
using namespace std;
const int mxn = 90005;
vvi adj(mxn);
vi dep(mxn);
vi par(mxn);
void dfs(int node, int from){
par[node] = from;
for(auto u : adj[node]){
if(u != from){
dep[u] = dep[node] + 1;
dfs(u, node);
}
}
}
int n;
void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
n = N;
f0r(i, N){
adj[i].clear();
dep[i] = 0;
par[i] = -1;
}
int M = U.size();
f0r(i, M){
adj[U[i]].pb(V[i]);
adj[V[i]].pb(U[i]);
}
dfs(0,-1);
int mx = 0;
f0r(i, N){
mx = max(mx, dep[i]);
}
vvi deps(mx+1);
vi edg(N, -1);
vi cha(M);
f0r(i, M){
deps[max(dep[U[i]], dep[V[i]])].pb(i);
if(dep[U[i]] > dep[V[i]]){
cha[i] = U[i];
edg[U[i]] = i;
}
else{
cha[i] = V[i];
edg[V[i]] = i;
}
}
vi quer(n-1);
f0r(i, n-1)quer[i] = 0;
long long r = ask(quer);
long long length = r / A;
int lo = 1; int hi = mx;
while(lo < hi){
int mid = lo + (hi - lo + 1) / 2;
vi quer(n-1);
f0r(i, n){
if(dep[i] >= mid){
quer[edg[i]] = 1;
}
}
long long r = ask(quer);
if(r != length * A){
lo = mid;
}
else hi = mid - 1;
}
int ld = lo; //lowest depth in path, so must be at least depth of one of A and B
// dout(ld);
lo = 1; hi = ld;
while(lo < hi){
int mid = lo + (hi - lo) / 2;
vi quer(n-1);
FOR(i, 1, n){
if(dep[i] <= mid){
quer[edg[i]] = 1;
}
}
long long r = ask(quer);
if(r != length * A){
hi = mid;
}
else lo = mid + 1;
}
int hd = lo - 1;
// dout(hd);
lo = 0; hi = deps[ld].size() - 1;
while(lo < hi){
int mid = lo + (hi - lo) / 2;
vi quer(n-1);
f0r(i, deps[ld].size()){
if(i <= mid){
quer[deps[ld][i]] = 1;
}
}
long long r = ask(quer);
if(r != length * A){
hi = mid;
}
else{
lo = mid + 1;
}
}
// dout(lo);
// vout(deps[ld]);
int fi = cha[deps[ld][lo]];
// dout(fi);
int span = ld - hd;
if(span == length){
int se = fi;
f0r(i, length){
se = par[se];
}
answer(fi, se);
}
else{
int od = length - span + hd;
if(od == ld){
lo++; hi = deps[ld].size() - 1; int slo = lo;
// cout<<lo<<' '<<hi<<endl;
while(lo < hi){
int mid = lo + (hi - lo) / 2;
vi quer(n-1);
FOR(i, slo, deps[ld].size()){
if(i <= mid){
quer[deps[ld][i]] = 1;
}
}
long long r = ask(quer);
if(r != length * A){
hi = mid;
}
else{
lo = mid + 1;
}
}
int se = cha[deps[ld][lo]];
answer(fi, se);
}
else{
vi bababa(n);
int cur = fi;
while(cur != 0){
bababa[cur] = 1;
cur = par[cur];
}
lo = 0; hi = deps[od].size() - 1;
while(lo < hi){
int mid = lo + (hi - lo) / 2;
vi quer(n-1);
f0r(i, deps[od].size()){
if(i <= mid && bababa[cha[deps[od][i]]] == 0){
quer[deps[od][i]] = 1;
}
}
long long r = ask(quer);
if(r != length * A){
hi = mid;
}
else{
lo = mid + 1;
}
}
int se = cha[deps[od][lo]];
// dout2(fi, se);
answer(fi, se);
}
}
// answer(0, 1);
/*
for (int j = 0; j < 50; ++j) {
std::vector<int> w(M);
for (int i = 0; i < M; ++i) {
w[i] = 0;
}
long long toll = ask(w);
}
answer(0, N - 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... |