제출 #1091764

#제출 시각아이디문제언어결과실행 시간메모리
1091764MMihalev철로 (IOI14_rail)C++14
22 / 100
43 ms604 KiB
#include<iostream> #include<vector> #include<algorithm> #include<set> #include "rail.h" using namespace std; set<int>L; set<int>R; int lidx,ridx; int pos0; bool checkdist(int pos,int type,int idx,int realdist) { if(L.count(pos) or R.count(pos))return 0; int curdist=1e9; if(pos>pos0) { if(type==2)curdist=pos-pos0; else { auto it=R.upper_bound(pos); if(it!=R.end()) { curdist=2*(*it)-pos-pos0; } } } else { auto it=R.upper_bound(pos0); if(it!=R.end()) { if(type==1) { curdist=2*(*it)-pos0-pos; } else { auto it2=L.lower_bound(pos); if(it2!=L.begin()) { --it2; curdist=(*it)-pos0+(*it)-(*it2)+pos-(*it2); } } } } return (curdist==realdist); } void findLocation(int N, int first, int location[], int stype[]) { int n=N; pos0=first; location[0]=first; stype[0]=1; lidx=0; vector<pair<int,int>>v; for(int i=1;i<n;i++) { v.push_back({getDistance(0,i),i}); } sort(v.begin(),v.end()); ridx=v[0].second; location[ridx]=location[0]+v[0].first; stype[ridx]=2; L.insert(location[0]); R.insert(location[ridx]); for(int i=1;i<v.size();i++) { int idx=v[i].second; int rd=v[i].first; int ldist=getDistance(lidx,idx); int rdist=getDistance(ridx,idx); int cnt=0; if(location[lidx]+ldist<location[ridx] && checkdist(location[lidx]+ldist,2,idx,rd)) { int db=rdist-(location[ridx]-(location[lidx]+ldist)); if(db>0 && db%2==0) { db/=2; if(L.count(location[lidx]+ldist-db)) { cnt++; location[idx]=location[lidx]+ldist; stype[idx]=2; if(location[idx]>location[ridx])ridx=idx; R.insert(location[idx]); //continue; } } } /// ( )i ) if(location[lidx]+ldist>location[ridx] && checkdist(location[lidx]+ldist,2,idx,rd)) { int db=rdist-(location[lidx]+ldist-location[ridx]); if(db>0 && db%2==0) { db/=2; if(L.count(location[ridx]-db)) { cnt++; location[idx]=location[lidx]+ldist; stype[idx]=2; if(location[idx]>location[ridx])ridx=idx; R.insert(location[idx]); //continue; } } } /// ( ) )i if(location[ridx]-rdist>location[lidx] && checkdist(location[ridx]-rdist,1,idx,rd)) { int db=ldist-(location[ridx]-rdist-location[lidx]); if(db>0 && db%2==0) { db/=2; if(R.count(location[ridx]-rdist+db)) { cnt++; location[idx]=location[ridx]-rdist; stype[idx]=1; if(location[idx]<location[lidx])lidx=idx; L.insert(location[idx]); //continue; } } } /// ( i( ) if(location[ridx]-rdist<location[lidx] && checkdist(location[ridx]-rdist,1,idx,rd)) { int db=ldist-(location[lidx]-(location[ridx]-rdist)); if(db>0 && db%2==0) { db/=2; if(R.count(location[lidx]+db)) { cnt++; location[idx]=location[ridx]-rdist; stype[idx]=1; if(location[idx]<location[lidx])lidx=idx; L.insert(location[idx]); //continue; } } } if(n>100 && cnt>1)while(1); /// i( ( ) } }

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

rail.cpp: In function 'void findLocation(int, int, int*, int*)':
rail.cpp:75:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |     for(int i=1;i<v.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...