#include "rail.h"
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int mp[5005][5005];
int ramase;
int getd(int x, int y)
{
if (x == y)
return 0;
if (x < 0 || y < 0)
return INF;
if (x > y)
swap(x, y);
if (mp[x][y] == 0)
{
ramase--;
mp[x][y] = getDistance(x, y);
}
return mp[x][y];
}
void findLocation(int N, int first, int location[], int stype[])
{
for (int i = 0; i < N; i++)
location[i] = 0;
ramase = 3 * (N - 1);
location[0] = first;
stype[0] = 1;
vector<pair<int, int>> d0;
for (int i = 1; i < N; i++)
d0.push_back({getd(0, i), i});
sort(d0.begin(), d0.end());
int p = d0[0].second;
location[p] = location[0] + getd(0, p);
stype[p] = 2;
vector<bool> sure(N, 0), semi(N, 0), rau(N, 0);
sure[0] = sure[p] = 1;
for (int pas = 1; pas < d0.size(); pas++)
{
int i = d0[pas].second;
if (sure[i])
continue;
if (getd(0, i) == getd(0, p) + getd(p, i))
{
if (semi[i])
assert(location[i] == location[p] - getd(p, i));
stype[i] = 1;
location[i] = location[p] - getd(p, i);
sure[i] = 1;
map<int, int> gata;
for (auto [_, j] : d0)
{
if (stype[j] != 0)
continue;
if (getd(0, j) == getd(0, p) + getd(p, j) && getd(0, i) < getd(0, j) && getd(0, j) < 2 * getd(0, i))
{
int x = getd(0, j) - getd(0, i);
if (!gata[x] && getd(0, j) == getd(0, i) + getd(i, j))
{
stype[j] = 2;
location[j] = location[i] + getd(i, j);
sure[j] = 1;
gata[x] = 1;
}
}
}
}
else
{
stype[i] = 2;
location[i] = location[0] + getd(0, i);
sure[i] = 1;
for (int j = 0; j < N; j++)
{
if (stype[j] != 0)
continue;
if (getd(0, i) < getd(0, j) && getd(0, j) < 2 * getd(0, i))
{
if (getd(0, j) == getd(0, i) + getd(i, j))
{
stype[j] = 1;
location[j] = location[i] - getd(i, j);
sure[j] = 1;
}
}
}
}
}
}
# | 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... |