# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
348825 | dennisstar | 철로 (IOI14_rail) | C++17 | 0 ms | 0 KiB |
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 <bits/stdc++.h>
#include "rail.h"
#define eb emplace_back
using namespace std;
const int MX = 5e3 + 5;
const int INF = 1e9;
int L[MX], *T, D[2][MX];
int X;
int nn, cnt;
int gd(int s, int e) {
cnt++;
assert(cnt<=3*(nn-1));
if (s==e) return 0;
return getDistance(s, e);
}
void sol1(vector<int> l) {
sort(l.begin(), l.end(), [&](int x, int y) { return D[1][x]<D[1][y]; });
int lst=0;
vector<int> v={X, 0};
for (auto &i:l) {
int d=gd(i, lst), fl=0;
for (int j=1; j<v.size(); j++)
if (L[v[j-1]]>L[lst]-d&&L[lst]-d>L[v[j]]&&D[1][i]==D[1][v[j]]+d+(L[lst]-L[v[j]])) {
fl=1;
break;
}
if (fl) {
L[i]=L[lst]+d;
T[i]=2;
}
else {
L[i]=L[X]-D[1][i];
T[i]=1;
lst=i;
v.eb(i);
}
}
}
void sol2(vector<int> r) {
sort(r.begin(), r.end(), [&](int x, int y) { return D[0][x]<D[0][y]; });
int lst=X;
vector<int> v={0, X};
for (auto &i:r) {
int d=gd(i, lst), fl=0;
for (int j=1; j<v.size(); j++)
if (L[v[j-1]]<L[lst]-d&&L[lst]-d<L[v[j]]&&D[0][i]==D[0][v[j]]+d-(L[lst]-L[v[j]])) {
fl=1;
break;
}
if (fl) {
L[i]=L[lst]-d;
T[i]=1;
}
else {
L[i]=D[0][i];
T[i]=2;
lst=i;
v.eb(i);
}
}
}
void findLocation(int N, int first, int location[], int stype[]) {
nn=N;
T=stype;
T[0]=1;
int mn=INF;
for (int i=1; i<N; i++) {
D[0][i]=gd(0, i);
if (mn>D[0][i]) mn=D[0][i], X=i;
}
T[X]=2;
L[X]=mn;
for (int i=1; i<N; i++) if (i!=X) {
D[1][i]=gd(X, i);
if (mn>D[1][i]) mn=D[1][i];
}
vector<int> l, m, r;
for (int i=1; i<N; i++) if (i!=X) {
if (D[0][i]==D[1][i]+L[X]) {
if (D[1][i]<L[X]) m.eb(i);
else l.eb(i);
}
else if (D[0][i]-L[X]==D[1][i]-2*mn) r.eb(i);
}
for (auto &i:m) L[i]=L[X]-D[1][i], T[i]=1;
sol1(l);
sol2(r);
for (int i=0; i<N; i++) location[i]=L[i]+first;
}