#include "rail.h"
#include <map>
#include <set>
#include <cassert>
#define INF 1000000007
int Dist[5005][5005];
int leftU[5005];
bool operator<(std::pair<int, int> a, std::pair<int, int> b)
{
return (a.first < b.first || (a.first == b.first && a.second < b.second));
}
void findLocation(int N, int first, int location[], int stype[])
{
int i, j;
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
if (i == j)
Dist[i][j] = 0;
else
Dist[i][j] = -1;
}
}
location[0] = first;
stype[0] = 1;
int u, ud = INF;
for (i = 0; i < N; i++)
{
if (Dist[0][i] == -1)
{
Dist[0][i] = getDistance(0, i);
Dist[i][0] = Dist[0][i];
if (Dist[0][i] < ud)
{
u = i;
ud = Dist[0][i];
}
}
}
if (ud == INF)
return;
location[u] = first + ud;
stype[u] = 2;
for (i = 0; i < N; i++)
{
if (Dist[u][i] == -1)
{
Dist[u][i] = getDistance(u, i);
Dist[i][u] = Dist[u][i];
if (Dist[u][i] < Dist[u][0])
{
location[i] = location[u] - Dist[u][i];
stype[i] = 1;
}
}
}
// for (i = 0; i < N; i++)
// printf("i%d #%d %d\n", i, stype[i], location[i]);
// printf("u%d\n", u);
int v, d;
std::set<std::pair<int, int> > M;
std::set<int> C;
M.clear();
C.clear();
v = 0;
C.insert(location[0]);
for (i = 0; i < N; i++)
{
if (stype[i] != 0) continue;
if (Dist[0][i] != Dist[0][u] + Dist[u][i]) continue;
M.insert({Dist[u][i], i});
}
std::set<std::pair<int, int> >::iterator it;
for (it = M.begin(); it != M.end(); it++)
{
if (Dist[v][it->second] == -1)
{
Dist[v][it->second] = getDistance(v, it->second);
Dist[it->second][v] = Dist[v][it->second];
}
d = (Dist[u][v] + Dist[v][it->second] - Dist[u][it->second])/2;
// printf("it (%d %d) d %d -> find %d\n", it->first, it->second, d, location[v] + d);
if (C.find(location[v] + d) != C.end())
{
location[it->second] = location[v] + Dist[v][it->second];
stype[it->second] = 2;
}
else
{
location[it->second] = location[u] - Dist[u][it->second];
stype[it->second] = 1;
C.insert(location[it->second]);
v = it->second;
}
}
// for (i = 0; i < N; i++)
// printf("i%d #%d %d\n", i, stype[i], location[i]);
M.clear();
C.clear();
v = u;
C.insert(location[u]);
for (i = 0; i < N; i++)
{
if (stype[i] != 0) continue;
M.insert({Dist[0][i], i});
}
for (it = M.begin(); it != M.end(); it++)
{
if (Dist[v][it->second] == -1)
{
Dist[v][it->second] = getDistance(v, it->second);
Dist[it->second][v] = Dist[v][it->second];
}
d = (Dist[0][v] + Dist[v][it->second] - Dist[0][it->second])/2;
if (C.find(location[v] - d) != C.end())
{
location[it->second] = location[v] - Dist[v][it->second];
stype[it->second] = 1;
}
else
{
location[it->second] = location[0] + Dist[0][it->second];
stype[it->second] = 2;
C.insert(location[it->second]);
v = it->second;
}
}
for (i = 0; i < N; i++)
assert(stype[i] != 0);
// for (i = 0; i < N; i++)
// printf("i%d #%d %d\n", i, stype[i], location[i]);
}
Compilation message
rail.cpp: In function 'void findLocation(int, int, int*, int*)':
rail.cpp:82:23: warning: 'u' may be used uninitialized in this function [-Wmaybe-uninitialized]
d = (Dist[u][v] + Dist[v][it->second] - Dist[u][it->second])/2;
~~~~~~~~~^
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
764 KB |
Output is correct |
2 |
Correct |
2 ms |
764 KB |
Output is correct |
3 |
Correct |
2 ms |
800 KB |
Output is correct |
4 |
Correct |
2 ms |
820 KB |
Output is correct |
5 |
Correct |
2 ms |
1004 KB |
Output is correct |
6 |
Correct |
2 ms |
1004 KB |
Output is correct |
7 |
Correct |
2 ms |
1004 KB |
Output is correct |
8 |
Correct |
2 ms |
1004 KB |
Output is correct |
9 |
Correct |
2 ms |
1004 KB |
Output is correct |
10 |
Correct |
2 ms |
1004 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
1004 KB |
Output is correct |
2 |
Correct |
3 ms |
1004 KB |
Output is correct |
3 |
Correct |
3 ms |
1016 KB |
Output is correct |
4 |
Correct |
3 ms |
1016 KB |
Output is correct |
5 |
Correct |
3 ms |
1020 KB |
Output is correct |
6 |
Correct |
3 ms |
1020 KB |
Output is correct |
7 |
Correct |
2 ms |
1076 KB |
Output is correct |
8 |
Correct |
2 ms |
1076 KB |
Output is correct |
9 |
Correct |
3 ms |
1076 KB |
Output is correct |
10 |
Correct |
2 ms |
1076 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
179 ms |
98896 KB |
Output is correct |
2 |
Correct |
179 ms |
98896 KB |
Output is correct |
3 |
Correct |
175 ms |
98896 KB |
Output is correct |
4 |
Correct |
232 ms |
98896 KB |
Output is correct |
5 |
Correct |
176 ms |
98896 KB |
Output is correct |
6 |
Correct |
181 ms |
98940 KB |
Output is correct |
7 |
Incorrect |
184 ms |
98940 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
166 ms |
98940 KB |
Output is correct |
2 |
Correct |
177 ms |
98940 KB |
Output is correct |
3 |
Correct |
166 ms |
98940 KB |
Output is correct |
4 |
Correct |
171 ms |
98940 KB |
Output is correct |
5 |
Correct |
173 ms |
98940 KB |
Output is correct |
6 |
Correct |
187 ms |
98988 KB |
Output is correct |
7 |
Incorrect |
179 ms |
99032 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |