Submission #121219

#TimeUsernameProblemLanguageResultExecution timeMemory
121219Rudy420Rail (IOI14_rail)C++17
100 / 100
80 ms760 KiB
#include <bits/stdc++.h> using namespace std; #define x first #define y second #define ll long long #define pi pair<int,int> #define pl pair<ll,ll> #define pd pair<double,double> #define ld long double #define pld pair<ld,ld> #define lg length() #define sz size() #define vi vector<int> #define vl vector<ll> #define vp vector<pi> #define vpl vector<pl> #define pb push_back #define INF 1000000005 #define LINF 1000000000000000005 #ifdef LOCAL_DEFINE mt19937 rng(69); #else seed_seq seq{ (uint64_t) chrono::duration_cast<chrono::nanoseconds>(chrono::high_resolution_clock::now().time_since_epoch()).count(), //(uint64_t) __builtin_ia32_rdtsc(), //(uint64_t) (uintptr_t) make_unique<char>().get() }; mt19937 rng(seq); #endif #include "rail.h" void findLocation(int n, int x, int p[], int t[]) { if(n==1){ p[0]=x; t[0]=1; return; } int a[n+5],b[n+5]; for(int i=1;i<n;i++) a[i]=getDistance(0,i); int mn=INF,y=-1; for(int i=1;i<n;i++){ if(a[i]<mn) mn=a[i],y=i; } for(int i=0;i<n;i++){ if(i==y) continue; b[i]=getDistance(y,i); } mn=INF; int z=-1; for(int i=0;i<n;i++){ if(i==y) continue; if(b[i]<mn) mn=b[i],z=i; } int diff=b[z]-a[y]; p[z]=x-diff; p[y]=p[z]+b[z]; t[z]=1; t[y]=2; for(int i=0;i<n;i++){ a[i]+=diff; } vector <pi> l,r; vector <int> u,v; for(int i=0;i<n;i++){ if(i==y || i==z) continue; if(i==0) a[i]=2*(p[y]-p[z])-diff; if(a[i]>b[i]) l.pb({b[i],i}); else r.pb({a[i],i}); } sort(l.begin(),l.end()); u.pb(p[z]); int f=z; for(pi i : l){ int d=getDistance(i.y,f); p[i.y]=p[f]+d; if(p[i.y]>=p[z]){ p[i.y]=p[y]-b[i.y]; t[i.y]=1; u.pb(p[i.y]); f=i.y; } int c=*(lower_bound(u.begin(),u.end(),p[i.y],greater<int>())); if(b[i.y]==p[i.y]+p[y]-2*c && p[i.y]!=c){ t[i.y]=2; } else{ p[i.y]=p[y]-b[i.y]; t[i.y]=1; u.pb(p[i.y]); f=i.y; } } sort(r.begin(),r.end()); v.pb(p[y]); f=y; for(pi i : r){ int d=getDistance(i.y,f); p[i.y]=p[f]-d; if(p[i.y]<=p[y]){ p[i.y]=p[z]+a[i.y]; t[i.y]=2; v.pb(p[i.y]); f=i.y; } int c=*(lower_bound(v.begin(),v.end(),p[i.y])); if(a[i.y]==2*c-p[i.y]-p[z] && p[i.y]!=c){ t[i.y]=1; } else{ p[i.y]=p[z]+a[i.y]; t[i.y]=2; v.pb(p[i.y]); f=i.y; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...