Submission #114441

#TimeUsernameProblemLanguageResultExecution timeMemory
114441tjd229Rail (IOI14_rail)C++14
100 / 100
157 ms78584 KiB
#include <stdio.h> #include "rail.h" #include <vector> #include <algorithm> #define pii pair<int,int> using namespace std; int d[5000][5000]; int call; int getDist(int i,int j) { if (i == j) return 0; if (!d[i][j]) d[i][j] = d[j][i] = getDistance(i, j), ++call; return d[i][j]; } void findLocation(int N, int first, int location[], int stype[]) { int i; location[0] = first; stype[0] = 1; vector<pii > v; int rc=0; int fi = 0; int mn = 1e9; for (i = 1; i < N; ++i) { int d = getDist(0, i); if (mn > d) { mn = d; fi = i; } } location[fi] = first + mn; stype[fi] = 2; for (i = 1; i < N; ++i) {//find closest C if (i == fi) continue; int dist = getDist(fi,i); if (getDist(0, i) > dist && dist < getDist(0, fi) && getDist(0, i) - getDist(0, fi) == dist) { stype[i] = 1; location[i] = location[fi] - dist; if (location[rc] < location[i]) rc = i; } else v.push_back({getDist(i,0),i}); } sort(v.begin(), v.end()); vector<pii > left = { {-location[rc],rc} }; vector<pii >right = { {location[fi],fi} }; //coord,ix for (auto p : v) { int last = call; int x = p.second; d[rc][x] = d[x][rc] = getDist(0, x) - (location[rc]-location[0]); //printf("x:%d,%d\n", x,d[rc][x]); if (getDist(rc, x) < getDist(x, fi)) { int r = right.back().second; int pred = location[r]-getDist(r,x); if (pred > first) { pii p = {pred,10000}; auto lb = upper_bound(right.begin(),right.end(),p); int nr = lb->second; d[nr][x] = d[x][nr] = getDist(r,x)-(location[r]-location[nr]); r = nr; } //init case && inner condi. if (r !=fi && getDist(rc, x) == getDist(x, r) + getDist(rc, r)) { stype[x] = 1; location[x] = pred; } else { stype[x] = 2; location[x] = location[rc]+getDist(rc,x); right.push_back({location[x],x}); } } else { int l = left.back().second; int pred = location[l] + getDist(l,x); if (pred < first) { pii p = {-pred,10000}; auto lb = upper_bound(left.begin(), left.end(), p); int nl = lb->second; d[nl][x] = d[x][nl] = getDist(l, x) - (location[nl] - location[l]); l = nl; } if (l !=rc&& getDist(fi, x) == getDist(l, x) + getDist(fi, l)) { stype[x] = 2; location[x] = pred; } else { stype[x] = 1; location[x] = location[fi] - getDist(fi,x); left.push_back({-location[x],x}); } } } }

Compilation message (stderr)

rail.cpp: In function 'void findLocation(int, int, int*, int*)':
rail.cpp:45:7: warning: unused variable 'last' [-Wunused-variable]
   int last = call;
       ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...