제출 #91877

#제출 시각아이디문제언어결과실행 시간메모리
91877KLPP철로 (IOI14_rail)C++14
100 / 100
94 ms764 KiB
#include <bits/stdc++.h> #include "rail.h" using namespace std; void findLocation(int N, int first, int location[], int stype[]) { int n=N; for(int i=0;i<n;i++){ location[i]=-1; stype[i]=-1; } location[0]=first; stype[0]=1; int dist0[n]; dist0[0]=0; for(int i=1;i<n;i++){ dist0[i]=getDistance(0,i); } int m=1; for(int i=1;i<n;i++){ if(dist0[i]<dist0[m])m=i; } int distm[n]; for(int i=0;i<n;i++){ if(i==m)distm[i]=0; else{ distm[i]=getDistance(m,i); } } stype[m]=2; location[m]=location[0]+dist0[m]; vector<pair<int,int> > vleft; vector<pair<int,int> >vright; for(int i=0;i<n;i++){ if(i==0){ vleft.push_back(pair<int,int>(distm[i],i)); } else if(i==m){ vright.push_back(pair<int,int>(dist0[i],i)); } else if(dist0[i]==distm[i]+dist0[m]){ vleft.push_back(pair<int,int>(distm[i],i)); }else{ vright.push_back(pair<int,int>(dist0[i],i)); } } sort(vleft.begin(),vleft.end()); sort(vright.begin(),vright.end()); vector<int> C; for(int i=0;i<vleft.size();i++){ //cout<<vleft[i].first<<" "<<vleft[i].second<<endl; if(C.size()==0){ C.push_back(vleft[i].second); location[vleft[i].second]=location[m]-vleft[i].first; stype[vleft[i].second]=1; }else if(stype[vleft[i].second]==-1){ int d=getDistance(vleft[i].second,C[C.size()-1]); int posC=location[m]-vleft[i].first; int posD=location[C[C.size()-1]]+d; int lo,hi; lo=-1; hi=C.size(); while(hi-lo>1){ int mid=(hi+lo)/2; if(location[C[mid]]>posD){ lo=mid; }else hi=mid; }//cout<<C[C.size()-1]<<endl; //cout<<hi<<" "<<C[hi]<<" "<<posD<<" "<<d<<endl; if(posD+location[m]-2*location[C[hi]]==vleft[i].first){ location[vleft[i].second]=posD; stype[vleft[i].second]=2; }else{ C.push_back(vleft[i].second); location[vleft[i].second]=posC; stype[vleft[i].second]=1; } }else{//cout<<"A"<<endl; //cout<<stype[vleft[i].second]<<endl; if(stype[vleft[i].second]==1){//cout<<vleft[i].second<<endl; C.push_back(vleft[i].second); } } /*cout<<"vect:"<<endl; for(int j=0;j<C.size();j++)cout<<C[j]<<" "; cout<<endl;*/ } vector<int> D; for(int i=0;i<vright.size();i++){ //cout<<vright[i].first<<" A "<<vright[i].second<<endl; if(D.size()==0){ D.push_back(vright[i].second); location[vright[i].second]=location[0]+vright[i].first; stype[vright[i].second]=2; }else if(stype[vright[i].second]==-1){ int d=getDistance(vright[i].second,D[D.size()-1]); int posD=location[0]+vright[i].first; int posC=location[D[D.size()-1]]-d; int lo,hi; lo=-1; hi=D.size(); while(hi-lo>1){ int mid=(hi+lo)/2; if(location[D[mid]]<posC){ lo=mid; }else hi=mid; }//cout<<C[C.size()-1]<<endl; //cout<<hi<<" "<<D[hi]<<" "<<posC<<" "<<d<<endl; if(posC+location[0]-2*location[D[hi]]==-vright[i].first){ location[vright[i].second]=posC; stype[vright[i].second]=1; }else{ D.push_back(vright[i].second); location[vright[i].second]=posD; stype[vright[i].second]=2; } }else{//cout<<"A"<<endl; //cout<<stype[vleft[i].second]<<endl; if(stype[vright[i].second]==2){//cout<<vleft[i].second<<endl; D.push_back(vright[i].second); } } /*for(int j=0;j<D.size();j++)cout<<D[j]<<" "; cout<<endl;*/ } /*for(int i=0;i<n;i++){ cout<<stype[i]<<" "<<location[i]<<endl; }*/ }

컴파일 시 표준 에러 (stderr) 메시지

rail.cpp: In function 'void findLocation(int, int, int*, int*)':
rail.cpp:54:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<vleft.size();i++){
                 ~^~~~~~~~~~~~~
rail.cpp:94:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<vright.size();i++){
                 ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...