Submission #82458

#TimeUsernameProblemLanguageResultExecution timeMemory
82458KLPPHighway Tolls (IOI18_highway)C++14
51 / 100
314 ms15876 KiB
#include "highway.h" #include<vector> #include<iostream> #include<queue> #include<algorithm> using namespace std; typedef pair<int,int> pii; typedef long long int lld; void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { int m=U.size(); int lo=0; int hi=m-1; vector<int> NN(m); lld u=ask(NN); //cout<<u<<endl; while(hi>lo){//cout<<lo<<" "<<hi<<endl; int mid=(hi+lo)/2; vector<int> v(m); for(int i=lo;i<=mid;i++)v[i]=1; lld h=ask(v); if(h>u){ hi=mid; }else lo=mid+1; }//cout<<hi<<endl; //cout<<hi<<endl; vector<pair<int,int> > nei[N]; for(int i=0;i<m;i++){ nei[U[i]].push_back(pair<int,int>(V[i],i)); nei[V[i]].push_back(pair<int,int>(U[i],i)); } queue<int> q; int dist[N]; bool CC[N]; for(int i=0;i<N;i++){ dist[i]=-1; CC[i]=false; } CC[V[hi]]=true; dist[U[hi]]=0; dist[V[hi]]=0; q.push(U[hi]); q.push(V[hi]); vector<int> tree[N]; //tree.push_back(hi); int parent[N]; while(!q.empty()){ int U=q.front();q.pop(); for(int i=0;i<nei[U].size();i++){ int V=nei[U][i].first; if(dist[V]==-1){ dist[V]=dist[U]+1; q.push(V); nei[U].push_back(pii(V,nei[U][i].second)); nei[V].push_back(pii(U,nei[U][i].second)); //cout<<nei[U][i].second<<endl; CC[V]=CC[U]; parent[V]=nei[U][i].second; } } } /*for(int i=0;i<N;i++){ cout<<CC[i]<<" "<<dist[i]<<endl; }*/ //OK vector<pair<pii,int> > VV; for(int i=0;i<N;i++){ if(!CC[i] && dist[i]>0){ VV.push_back(pair<pii,int>(pii(dist[i],i),parent[i])); //cout<<dist[i]<<" "<<parent[i]<<endl; } }sort(VV.begin(),VV.end()); int XX=U[hi]; int YY=V[hi]; //cout<<XX<<" "<<YY<<endl; lo=-1; hi=VV.size(); while(hi-lo>1){ int mid=(hi+lo)/2; vector<int> asking(m); for(int i=mid;i<VV.size();i++)asking[VV[i].second]=1; //for(int i=0;i<N;i++)cout<<asking[i]; //cout<<endl; lld R=ask(asking); //cout<<R<<" "<<u<<endl; if(R>u)lo=mid; else hi=mid; } //cout<<lo<<" "<<hi<<endl; //cout<<VV[lo].second<<endl; int S=-1; //cout<<lo<<endl; if(lo==-1)S=XX; else{ S=VV[lo].first.second; } //cout<<S<<endl; VV.clear(); for(int i=0;i<N;i++){ if(CC[i] && dist[i]>0){ VV.push_back(pair<pii,int>(pii(dist[i],i),parent[i])); //cout<<dist[i]<<" "<<parent[i]<<endl; } }sort(VV.begin(),VV.end()); //for(int i=0;i<VV.size();i++)cout<<VV[i].first.first<<" "<<VV[i].first.second<<" "<<VV[i].second<<endl; lo=-1; hi=VV.size(); while(hi-lo>1){//cout<<lo<<" "<<hi<<endl; int mid=(hi+lo)/2; vector<int> asking(m); for(int i=mid;i<VV.size();i++)asking[VV[i].second]=1; /*for(int i=0;i<m;i++)cout<<asking[i]; cout<<endl;*/ lld R=ask(asking); //cout<<R<<" "<<u<<" "<<mid<<endl; if(R>u)lo=mid; else hi=mid; } //cout<<lo<<" "<<hi<<endl; //cout<<VV[lo].second<<endl; int T=-1; if(lo==-1)T=YY; else{ T=VV[lo].first.second; } //cout<<S<<" "<<T<<endl; answer(S,T); }

Compilation message (stderr)

highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:49:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<nei[U].size();i++){
               ~^~~~~~~~~~~~~~
highway.cpp:81:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=mid;i<VV.size();i++)asking[VV[i].second]=1;
                 ~^~~~~~~~~~
highway.cpp:111:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=mid;i<VV.size();i++)asking[VV[i].second]=1;
                 ~^~~~~~~~~~
#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...