Submission #1273453

#TimeUsernameProblemLanguageResultExecution timeMemory
1273453Aviansh철로 (IOI14_rail)C++20
8 / 100
75 ms98380 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]; } void findLocation(int n, int first, int location[], int stype[]) { for(int i = 0;i<n;i++){ for(int j = 0;j<n;j++){ mem[i][j]=-1; } } location[0]=first; stype[0]=1; //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]; stype[rig]=2; int fir = rig; int fird = rigd; int lef = 0; assert(dist0[0][0]==0&&dist0[0][1]==0); int lefd = 0; for(int i = 2;i<n;i++){ int dr = dist(rig,dist0[i][1]); int dl = dist(lef,dist0[i][1]); int d0 = dist(0,dist0[i][1]); if(d0<=dr+rigd){ //means it is on the left int dlr = location[rig]-location[lef]; if(dlr+dl==dr){ //went to the right so not new left location[dist0[i][1]]=location[lef]+dl; stype[dist0[i][1]]=2; } else{ location[dist0[i][1]]=location[rig]-dr; stype[dist0[i][1]]=1; lef=dist0[i][1]; lefd=dist0[i][0]; } } else{ //means it is on right of right //so new right discovered rig=dist0[i][1]; rigd=dist0[i][0]; location[rig]=first+rigd; stype[rig]=2; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...