Submission #1102168

#TimeUsernameProblemLanguageResultExecution timeMemory
1102168alexander707070Rail (IOI14_rail)C++14
30 / 100
56 ms2708 KiB
#include<bits/stdc++.h> #include "rail.h" #define MAXN 1000007 using namespace std; const int inf=1e7; int n,pos,fr; pair<int,int> block[MAXN]; pair<int,int> dist[5007]; int last; vector<int> clos,opos; int sum[MAXN]; int loc[MAXN]; vector< pair<int,int> > know; int distan(int x,int y,int xx,int yy){ if(y!=yy){ if(y==1 and yy==2){ if(x<xx)return xx-x; pair<int,int> news={inf,0}; for(pair<int,int> s:know){ if(s.first>x and s.second==2 and s.first<news.first){ news=s; } } return distan(news.first,news.second,xx,yy)+abs(news.first-x); }else{ if(x>xx)return x-xx; pair<int,int> news={-2,0}; for(pair<int,int> s:know){ if(s.first<x and s.second==1 and s.first>news.first){ news=s; } } return distan(news.first,news.second,xx,yy)+abs(news.first-x); } }else{ if(y==1 and yy==1){ if(x>xx)swap(x,xx); pair<int,int> news={inf,0}; for(pair<int,int> s:know){ if(s.first>xx and s.second==2 and s.first<news.first){ news=s; } } return distan(news.first,news.second,xx,yy)+abs(news.first-x); }else{ if(x>xx)swap(x,xx); pair<int,int> news={-2,0}; for(pair<int,int> s:know){ if(s.first<x and s.second==1 and s.first>news.first){ news=s; } } return distan(news.first,news.second,xx,yy)+abs(news.first-x); } } } bool check(int pos,int st,int d1,int d2){ int s1=distan(pos,st,loc[dist[last].second],2); int s2=distan(pos,st,loc[dist[fr].second],1); return s1==d1 and s2==d2; } void findLocation(int N, int first, int location[], int stype[]){ n=N; loc[0]=first; stype[0]=1; know.push_back({first,1}); for(int i=1;i<n;i++){ dist[i].first=getDistance(0,i); dist[i].second=i; } sort(dist+1,dist+n); last=1; fr=0; loc[dist[1].second]=first+dist[1].first; stype[dist[1].second]=2; know.push_back({loc[dist[1].second],2}); clos.push_back(1); opos.push_back(0); for(int i=2;i<n;i++){ int curr=getDistance(dist[i].second,dist[last].second); int where=loc[dist[last].second]-curr; int curr2=getDistance(dist[i].second,dist[fr].second); int where2=loc[dist[fr].second]+curr2; if(check(where,1,curr,curr2)){ loc[dist[i].second]=where; stype[dist[i].second]=1; }else if(true){ loc[dist[i].second]=where2; stype[dist[i].second]=2; }else{ cout<<"failed\n"; } if(loc[dist[i].second]>loc[dist[last].second]){ last=i; clos.push_back(i); } if(loc[dist[i].second]<loc[dist[fr].second]){ fr=i; opos.push_back(i); } know.push_back({loc[dist[i].second],stype[dist[i].second]}); } for(int i=0;i<n;i++){ location[i]=loc[i]; } return; } /* 3 8 1 0 2 2 1 3 2 5 2 6 1 7 1 8 2 10 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...