Submission #1273559

#TimeUsernameProblemLanguageResultExecution timeMemory
1273559AvianshRail (IOI14_rail)C++20
100 / 100
80 ms98740 KiB
#include "rail.h" #include <bits/stdc++.h> using namespace std; const int maxn = 5005; int mem[maxn][maxn]; int dist(int i, int j){ if(mem[i][j]==-1){ mem[i][j]=getDistance(i,j); mem[j][i]=mem[i][j]; } return mem[i][j]; } set<int>typc; set<int>typd; int basedon1(int x, int r){ //r->x where r is D, x is D auto it = typc.upper_bound(x); if(it!=typc.begin()){ it--; } else{ return 1e9; } return r-(*it)+x-(*it); } int basedon2(int x, int f){ auto it = typd.upper_bound(max(x,f)); if(it==typd.end()){ return 1e9; } return (*it)-x+(*it)-f; } void findLocation(int n, int first, int location[], int stype[]) { typc.clear(); typd.clear(); for(int i = 0;i<n;i++){ for(int j = 0;j<n;j++){ mem[i][j]=-1; } } location[0]=first; stype[0]=1; typc.insert(first); //base set array<int,2> dist0[n]; dist0[0]={0,0}; for(int i = 1;i<n;i++){ dist0[i]={dist(0,i),i}; } sort(dist0,dist0+n); int rig = dist0[1][1]; int rigd = dist0[1][0]; location[rig]=first+dist0[1][0]; typd.insert(first+dist0[1][0]); stype[rig]=2; int lef = 0; int lefd = 0; for(int i = 2;i<n;i++){ int k = dist0[i][1]; int dr = dist(rig,k); int dl = dist(lef,k); int d0 = dist(0,k); //Case 1: int pos = location[lef]+dl; if(pos<first){ if(basedon1(pos,location[rig])==dr){ //nice this is good location[k]=pos; stype[k]=2; typd.insert(pos); continue; } } //Case 2: pos=location[rig]-dr; if(pos>first){ if(d0==dl-(first-location[lef])){ if(basedon2(pos,first)==d0&&basedon2(pos,location[lef])==dl){ //valid location[k]=pos; stype[k]=1; typc.insert(pos); continue; } } } else{ //Case 3: if(basedon2(pos,first)==d0){ //valid assert(pos<location[lef]); location[k]=pos; stype[k]=1; lef=k; typc.insert(pos); continue; } } //Case 4: pos=location[lef]+dl; location[k]=pos; stype[k]=2; assert(pos>location[rig]); rig=k; typd.insert(pos); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...