제출 #965488

#제출 시각아이디문제언어결과실행 시간메모리
965488FEDIKUS통행료 (IOI18_highway)C++17
23 / 100
194 ms11576 KiB
#include "highway.h" #include<bits/stdc++.h> using namespace std; const int maxn=90010; vector<pair<int,int> > g[maxn]; int uradi(int n,int m,int a,int b,int bez,int prva,int pocetak,vector<int> &u,vector<int> &v){ queue<int> bfs; bfs.push(pocetak); vector<bool> posetio(n,0); posetio[pocetak]=true; vector<int> redosled; vector<int> intime(n,0); int t=0; while(!bfs.empty()){ int node=bfs.front(); intime[node]=t++; bfs.pop(); for(auto [u,ind]:g[node]){ if(posetio[u]) continue; //if(ind<prva) continue; posetio[u]=true; bfs.push(u); redosled.push_back(ind); } } int l=0; int r=int(redosled.size())-1; // ? int ret=-1; while(l<=r){ int mid=l+(r-l)/2; vector<int> w(m,1); for(int i=0;i<mid;i++){ w[redosled[i]]=0; } if(ask(w)>bez){ ret=mid; l=mid+1; }else r=mid-1; } if(intime[u[redosled[ret]]]>intime[v[redosled[ret]]]){ return u[redosled[ret]]; }else return v[redosled[ret]]; } void find_pair(int n,vector<int> u,vector<int> v,int a,int b) { int m=u.size(); int prva=0; int l=1,r=m; int bez=ask(vector<int>(m,0)); while(l<=r){ int mid=l+(r-l)/2; vector<int> w(m,0); fill(w.begin(),w.begin()+mid,1); if(ask(w)>bez){ prva=mid; r=mid-1; }else l=mid+1; } prva--; for(int i=0;i<m;i++){ g[u[i]].push_back({v[i],i}); g[v[i]].push_back({u[i],i}); } int lik1=uradi(n,m,a,b,bez,prva,u[prva],u,v); int lik2=uradi(n,m,a,b,bez,prva,lik1,u,v); answer(lik1,lik2); }
#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...