Submission #653904

#TimeUsernameProblemLanguageResultExecution timeMemory
653904LoboRail (IOI14_rail)C++17
56 / 100
331 ms99532 KiB
#include "rail.h" #include<bits/stdc++.h> using namespace std; const int maxn = 5050; const int inf = 1e9+10; #define pb push_back #define mp make_pair #define fr first #define sc second #define all(x) x.begin(),x.end() int d[maxn][maxn]; int p[maxn], tp[maxn]; int dist(int a, int b) { if(d[a][b] != -1) return d[a][b]; return d[a][b] = getDistance(a,b); } void findLocation(int N, int first, int location[], int stype[]) { int n = N; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++) { d[i][j] = -1; } } p[0] = first; tp[0] = 0; // find the closest to 0 int b = -1; for(int i = 1; i < n; i++) { if(b == -1 || dist(0,i) < dist(0,b)) b = i; } p[b] = p[0]+dist(0,b); tp[b] = 1; // find the closest to b int a = -1; for(int i = 0; i < n; i++) { if(i == b) continue; if(a == -1 || dist(b,i) < dist(b,a)) a = i; } p[a] = p[b]-dist(b,a); tp[a] = 0; // int a = 0; // location[a] = p[a]; stype[a] = tp[a]+1; // location[b] = p[b]; stype[b] = tp[b]+1; // for(int i = 0; i < n; i++) { // if(i == a || i == b) continue; // if(dist(a,i) <= dist(b,i)) { // location[i] = p[a]+dist(a,i); // stype[i] = 2; // } // else { // location[i] = p[b]-dist(b,i); // stype[i] = 1; // } // } vector<pair<int,int>> lft,rgt; for(int i = 0; i < n; i++) { if(i == a || i == b) continue; if(dist(a,i) < dist(b,i)) { rgt.pb(mp(dist(a,i),i)); } else { lft.pb(mp(dist(b,i),i)); } } sort(all(rgt)); sort(all(lft)); int lastup = b; for(int i = 0; i < rgt.size(); i++) { int u = rgt[i].sc; int pup = p[a]+dist(a,u); int pdw = p[lastup]-dist(u,lastup); int v = lastup; for(int j = 0; j < i; j++) { int v1 = rgt[j].sc; if(tp[v1] == 1 && p[v1] > pdw) { v = v1; break; } } if(dist(a,u) == dist(a,v)+p[v]-pdw) { p[u] = pdw; tp[u] = 0; } else { p[u] = pup; tp[u] = 1; lastup = u; } // cout << u << " " << p[u] << " " << tp[u] << " " << v << " " << dist(a,u) << " " << dist(a,v)+dist(v,u) << endl; // if(p[a]+dist(a,u) >= dist(u,lastup)+2*p[lastdw]-p[lastup]) { // p[u] = p[a]+dist(a,u); // tp[u] = 1; // lastup = u; // } // else { // p[u] = p[lastup]-dist(u,lastup); // tp[u] = 0; // if(p[u] > p[lastdw]) lastdw = u; // } // cout << u << " == " << p[u] << " " << tp[u] << endl; // p[u] = -inf; // int v1 = -1; // for(int j = 0; j < i; j++) { // int v = rgt[j].sc; // // cout << u << " " << v << " " << 2*p[v]-p[a]-dist(a,u) << endl; // if(tp[v] == 1 && 2*p[v]-p[a]-dist(a,u) < p[v] && dist(a,u) == dist(a,v)+dist(v,u)) { // // p[u] = max(p[u],2*p[v]-p[a]-dist(a,u)); // if(p[u] < 2*p[v]-p[a]-dist(a,u)) { // p[u] = 2*p[v]-p[a]-dist(a,u); // v1 = v; // } // } // } // if(v1 != -1 && dist(a,u) != dist(a,v1)+dist(v1,u)) { // p[u] = -inf; // } // if(p[u] == -inf) { // tp[u] = 1; // p[u] = p[a]+dist(a,u); // } // else { // tp[u] = 0; // } } for(int i = 0; i < lft.size(); i++) { int u = lft[i].sc; p[u] = inf; for(int j = 0; j < i; j++) { int v = lft[j].sc; if(tp[v] == 0 && 2*p[v]+dist(b,u)-p[b] > p[v] && dist(b,u) == dist(b,v)+dist(v,u)) { p[u] = min(p[u],2*p[v]+dist(b,u)-p[b]); } } if(p[u] == inf) { tp[u] = 0; p[u] = p[b]-dist(b,u); } else { tp[u] = 1; } } for(int i = 0; i < n; i++) { location[i] = p[i]; stype[i] = tp[i]+1; // cout << i << " - " << p[i] << " " << tp[i]+1 << endl; } }

Compilation message (stderr)

rail.cpp: In function 'void findLocation(int, int, int*, int*)':
rail.cpp:75:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |     for(int i = 0; i < rgt.size(); i++) {
      |                    ~~^~~~~~~~~~~~
rail.cpp:135:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  135 |     for(int i = 0; i < lft.size(); i++) {
      |                    ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...