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<bits/stdc++.h>
using namespace std;
#include<highway.h>
const int inf=1e9+7;
/*int64_t ask(vector<int> w){
return 0;
}
void answer(int a, int b){
}*/
int find_edge(int m, int64_t dist){
vector<int> w(m, 0);
int l=0; int r=m-1;
int ans=m-1;
while(l<=r){
int mi=l+(r-l)/2;
w.assign(m, 0);
for(int i=0; i<=mi; i++){
w[i]=1;
}
int64_t resp=ask(w);
if(resp!=dist){
ans=mi;
r=mi-1;
}
else{
l=mi+1;
}
}
return ans;
}
void dfs(int v, int d, vector<vector<int> >& adi, vector<bool>& vis, vector<int>& cand, int dist){
if(vis[v]) return;
vis[v]=true;
if(d==dist){
cand.push_back(v);
}
for(auto u: adi[v]){
dfs(u, d+1, adi, vis, cand, dist);
}
}
int find_node(vector<int>& cand, vector<vector<int> >& con, int m, int dist){
vector<int> w(m, 0);
int l=0; int r=cand.size()-1;
int ans=r;
while(l<=r){
int mi=l+(r-l)/2;
w.assign(m, 0);
for(int i=0; i<=mi; i++){
for(auto x: con[i]){
w[x]=1;
}
}
int resp=ask(w);
if(resp!=dist){
ans=mi;
r=mi-1;
}
else{
l=mi+1;
}
}
return ans;
}
void find_pair(int n, vector<int> u, vector<int> v, int A, int B){
int m=u.size();
vector<int> w(m, 0);
vector<int> cand;
int64_t dist=ask(w);
int length=dist/(int64_t)A;
int x=find_edge(m, dist);
vector<bool> vis(n);
vector<vector<int> > adi(n);
vector<vector<int> > con(n);
for(int i=0; i<m; i++){
if(i==x) continue;
adi[v[i]].push_back(u[i]);
adi[u[i]].push_back(v[i]);
con[v[i]].push_back(i);
con[u[i]].push_back(i);
}
con[v[x]].push_back(x);
con[u[x]].push_back(x);
dfs(u[x], 0, adi, vis, cand, inf);
w.assign(n, 0);
for(int i=0; i<n; i++){
if(!vis[i]) continue;
for(auto j: con[i]){
w[j]=1;
}
}
int length1=(ask(w)-dist)/(B-A);
int64_t dist1=length1*A;
int length2=length-1-length1;
int64_t dist2=length2*A;
vis.assign(n, false);
cand.assign(0, 0);
dfs(u[x], 0, adi, vis, cand, length1);
int a=find_node(cand, con, m, dist);
vis.assign(n, false);
cand.assign(0, 0);
dfs(v[x], 0, adi, vis, cand, length2);
int b=find_node(cand, con, m, dist);
answer(a, b);
}
/*signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
}*/
Compilation message (stderr)
highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:106:13: warning: unused variable 'dist1' [-Wunused-variable]
106 | int64_t dist1=length1*A;
| ^~~~~
highway.cpp:108:13: warning: unused variable 'dist2' [-Wunused-variable]
108 | int64_t dist2=length2*A;
| ^~~~~
# | 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... |