This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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()
map<int,int> d[maxn];
int p[maxn], tp[maxn];
int dist(int a, int b) {
if(d[a].count(b)) return d[a][b];
return d[a][b] = getDistance(a,b);
}
void findLocation(int N, int first, int location[], int stype[]) {
int n = N;
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;
// 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));
for(int i = 0; i < rgt.size(); i++) {
int u = rgt[i].sc;
p[u] = inf;
for(int j = 0; j < i; j++) {
int v = rgt[i].sc;
if(tp[v] == 1 && 2*p[v]-p[a]-dist(a,u) < p[v]) {
p[u] = max(p[u],2*p[v]-p[a]-dist(a,u));
}
}
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[i].sc;
if(tp[v] == 0 && 2*p[v]+dist(b,u)-p[b] > p[v]) {
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:68: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]
68 | for(int i = 0; i < rgt.size(); i++) {
| ~~^~~~~~~~~~~~
rail.cpp:86: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]
86 | for(int i = 0; i < lft.size(); i++) {
| ~~^~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |