제출 #102987

#제출 시각아이디문제언어결과실행 시간메모리
102987daniel920712통행료 (IOI18_highway)C++14
51 / 100
209 ms13228 KiB
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <vector> #include <utility> #include "highway.h" using namespace std; vector < int > how; vector < pair < int , int > > a,b; vector < pair < int , int > > road[90005]; int n,m,x=-1,y=-1; long long t; bool have_V[90005]={0}; int F(int l,int r) { //printf("%d %d\n",l,r); //printf("%d %d\n",l,r); int i; for(i=l;i<=(l+r)/2;i++) how[i]=1; if(ask(how)>t) { for(i=0;i<=(l+r)/2;i++) how[i]=0; if(l==r) return l; else return F(l,(l+r)/2); } else { for(i=l;i<=(l+r)/2;i++) how[i]=0; if(l==r) return -1; else return F((l+r)/2+1,r); } } void Find1(int here) { //printf("a:%d\n",here); for(auto i:road[here]) { if(!have_V[i.first]) { a.push_back(make_pair(i.second,i.first)); have_V[i.first]=1; Find1(i.first); } } } void Find2(int here) { //printf("b:%d\n",here); for(auto i:road[here]) { if(!have_V[i.first]) { b.push_back(make_pair(i.second,i.first)); have_V[i.first]=1; Find2(i.first); } } } int Ans1(int l,int r) { //printf("a:%d %d\n",l,r); int i; if(l==r) return a[l].second; for(i=(l+r)/2+1;i<=r;i++) how[a[i].first]=1; if(ask(how)==t) { for(i=(l+r)/2+1;i<=r;i++) how[a[i].first]=0; return Ans1(l,(l+r)/2); } else { for(i=(l+r)/2+1;i<=r;i++) how[a[i].first]=0; return Ans1((l+r)/2+1,r); } } int Ans2(int l,int r) { int i; if(l==r) return b[l].second; for(i=(l+r)/2+1;i<=r;i++) how[b[i].first]=1; if(ask(how)==t) { for(i=(l+r)/2+1;i<=r;i++) how[b[i].first]=0; return Ans2(l,(l+r)/2); } else { for(i=(l+r)/2+1;i<=r;i++) how[b[i].first]=0; return Ans2((l+r)/2+1,r); } } void find_pair(int N,vector < int > U,vector < int > V,int A,int B) { int i,edge; n=N; m=U.size(); for(i=0;i<m;i++) how.push_back(0); for(i=0;i<m;i++) { road[U[i]].push_back(make_pair(V[i],i)); road[V[i]].push_back(make_pair(U[i],i)); } t=ask(how); edge=F(0,m-1); have_V[U[edge]]=1; have_V[V[edge]]=1; a.push_back(make_pair(edge,U[edge])); b.push_back(make_pair(edge,V[edge])); //x=U[edge]; //y=v[edge]; Find1(U[edge]); Find2(V[edge]); /*printf("a"); for(auto i:a) printf("%d ",i.first); printf("\n");*/ /*printf("b"); for(auto i:b) printf("%d ",i.first); printf("\n");*/ x=Ans1(0,a.size()-1); y=Ans2(0,b.size()-1); answer(x,y); //printf("%d %d %d\n",edge,U[edge],V[edge]); }
#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...