This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "highway.h"
//#include "grader.cpp"
#include <bits/stdc++.h>
using namespace std;
const int NN=2e5+5;
#define sc second
#define fr first
#define pb push_back
vector<pair<int,int>> g[NN];
vector<int> edge(NN),vertex(NN);
int cnt=0;
void dfs(int x, int p){
for(auto it: g[x]){
if(it.sc==p) continue;
vertex[cnt]=it.sc;
edge[it.fr]=cnt++;
dfs(it.sc,x);
}
}
int m;
int dist;
vector<int> w;
int get_first(){
int l=0,r=m-1;
while(l!=r){
int md=(l+r)/2;
for(int i=0;i<m;i++)
w[i]=(i<=md);
if(ask(w)!=dist)
r=md;
else
l=md+1;
}
return l;
}
int get_last(){
int l=-1,r=cnt-1;
while(l!=r){
int md=(l+r+1)/2;
for(int i=0;i<m;i++){
w[i]=(edge[i]>=md);
}
if(dist!=ask(w))
l=md;
else
r=md-1;
}
return l;
}
int ans[2];
void find_pair(int n, vector<int> u, vector<int> v, int a, int b) {
m=u.size();
w.resize(m);
dist=ask(w);
for(int i=0;i<m;i++){
g[u[i]].pb({i,v[i]});
g[v[i]].pb({i,u[i]});
}
//dfs(0,-1);
int e=get_first();
int A=u[e],B=v[e];
for(int i=0;i<2;i++){
cnt=0;
edge.assign(m,-1);
dfs(A,B);
int k=get_last();
ans[i]= k==-1?A:vertex[k];
swap(A,B);
}
answer(ans[0],ans[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... |