# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
153606 |
2019-09-14T21:28:45 Z |
johutha |
Sky Walking (IOI19_walk) |
C++14 |
|
4000 ms |
573456 KB |
#include "walk.h"
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#define int long long
using namespace std;
struct graph
{
int n = 0;
vector<vector<pair<int,int>>> adjlist;
vector<int> coord_x;
int add_vertex(int x)
{
n++;
adjlist.push_back(vector<pair<int,int>>());
coord_x.push_back(x);
return n - 1;
}
void add_edge(int from, int to, int w)
{
adjlist[from].push_back({to, w});
adjlist[to].push_back({from, w});
}
int dijkstra(int s, int z)
{
vector<int> dists(n, -1);
dists[s] = 0;
priority_queue<pair<int,int>> pq;
pq.push({0, s});
while (!pq.empty())
{
int curr = pq.top().second;
pq.pop();
for (auto p : adjlist[curr])
{
int next = p.first;
int t = p.second + dists[curr];
if (dists[next] != -1 && t >= dists[next]) continue;
dists[next] = t;
pq.push({-t, next});
}
}
return dists[z];
}
};
struct graph_creator
{
int n;
set<int> active;
map<int,int> last_vertices;
vector<signed> heights;
vector<signed> hpos;
vector<set<int>> walk_start;
vector<set<int>> walk_end;
int sx, zx;
int sv, zv;
graph g;
int _addv(int x, int y)
{
int nv = g.add_vertex(x);
if (active.find(y) != active.end())
{
g.add_edge(nv, last_vertices[y], hpos[x] - hpos[g.coord_x[last_vertices[y]]]);
}
active.insert(y);
last_vertices[y] = nv;
return nv;
}
int create_vert(int x, int y)
{
int nv = _addv(x, y);
set<int>::iterator cur = active.find(y);
auto nx = cur;
nx++;
if (nx != active.end() && (*nx) <= heights[x])
{
int nh = (*nx);
int hnv = _addv(x, nh);
g.add_edge(hnv, nv, nh - y);
}
if (cur != active.begin())
{
auto prev = cur;
prev--;
int lh = (*prev);
int lnv = _addv(x, lh);
g.add_edge(nv, lnv, y - lh);
}
return nv;
}
void create()
{
for (int i = 0; i < n; i++)
{
for (auto h : walk_start[i])
{
create_vert(i, h);
}
if (i == sx)
{
sv = create_vert(i, 0);
}
else if (i == zx)
{
zv = create_vert(i, 0);
}
for (auto h : active)
{
if (h > heights[i]) break;
create_vert(i, h);
}
for (auto h : walk_end[i])
{
active.erase(h);
}
active.erase(0);
}
}
};
int min_distance(vector<signed> x, vector<signed> h, std::vector<signed> l, std::vector<signed> r, std::vector<signed> y, signed s, signed g)
{
graph_creator gc;
gc.heights = h;
gc.n = x.size();
gc.hpos = x;
gc.walk_start.resize(gc.n);
gc.walk_end.resize(gc.n);
gc.sx = s;
gc.zx = g;
int k = l.size();
for (int i = 0; i < k; i++)
{
gc.walk_start[l[i]].insert(y[i]);
}
for (int i = 0; i < k; i++)
{
if (gc.walk_start[r[i]].find(y[i]) == gc.walk_start[r[i]].end())
{
gc.walk_end[r[i]].insert(y[i]);
}
else
{
gc.walk_start[r[i]].erase(y[i]);
}
}
gc.create();
return gc.g.dijkstra(gc.sv, gc.zv);
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
376 KB |
Output is correct |
2 |
Correct |
2 ms |
256 KB |
Output is correct |
3 |
Correct |
2 ms |
376 KB |
Output is correct |
4 |
Correct |
2 ms |
376 KB |
Output is correct |
5 |
Correct |
3 ms |
504 KB |
Output is correct |
6 |
Correct |
3 ms |
504 KB |
Output is correct |
7 |
Correct |
3 ms |
504 KB |
Output is correct |
8 |
Correct |
3 ms |
504 KB |
Output is correct |
9 |
Correct |
2 ms |
376 KB |
Output is correct |
10 |
Correct |
3 ms |
632 KB |
Output is correct |
11 |
Correct |
2 ms |
508 KB |
Output is correct |
12 |
Correct |
2 ms |
376 KB |
Output is correct |
13 |
Correct |
2 ms |
376 KB |
Output is correct |
14 |
Correct |
2 ms |
376 KB |
Output is correct |
15 |
Correct |
2 ms |
376 KB |
Output is correct |
16 |
Correct |
2 ms |
376 KB |
Output is correct |
17 |
Correct |
4 ms |
632 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
256 KB |
Output is correct |
2 |
Correct |
2 ms |
376 KB |
Output is correct |
3 |
Correct |
3301 ms |
297600 KB |
Output is correct |
4 |
Correct |
2405 ms |
309004 KB |
Output is correct |
5 |
Correct |
1509 ms |
236508 KB |
Output is correct |
6 |
Correct |
1645 ms |
208072 KB |
Output is correct |
7 |
Correct |
1605 ms |
236940 KB |
Output is correct |
8 |
Execution timed out |
4094 ms |
368264 KB |
Time limit exceeded |
9 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
95 ms |
22140 KB |
Output is correct |
2 |
Execution timed out |
4094 ms |
573456 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
95 ms |
22140 KB |
Output is correct |
2 |
Execution timed out |
4094 ms |
573456 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
376 KB |
Output is correct |
2 |
Correct |
2 ms |
256 KB |
Output is correct |
3 |
Correct |
2 ms |
376 KB |
Output is correct |
4 |
Correct |
2 ms |
376 KB |
Output is correct |
5 |
Correct |
3 ms |
504 KB |
Output is correct |
6 |
Correct |
3 ms |
504 KB |
Output is correct |
7 |
Correct |
3 ms |
504 KB |
Output is correct |
8 |
Correct |
3 ms |
504 KB |
Output is correct |
9 |
Correct |
2 ms |
376 KB |
Output is correct |
10 |
Correct |
3 ms |
632 KB |
Output is correct |
11 |
Correct |
2 ms |
508 KB |
Output is correct |
12 |
Correct |
2 ms |
376 KB |
Output is correct |
13 |
Correct |
2 ms |
376 KB |
Output is correct |
14 |
Correct |
2 ms |
376 KB |
Output is correct |
15 |
Correct |
2 ms |
376 KB |
Output is correct |
16 |
Correct |
2 ms |
376 KB |
Output is correct |
17 |
Correct |
4 ms |
632 KB |
Output is correct |
18 |
Correct |
2 ms |
256 KB |
Output is correct |
19 |
Correct |
2 ms |
376 KB |
Output is correct |
20 |
Correct |
3301 ms |
297600 KB |
Output is correct |
21 |
Correct |
2405 ms |
309004 KB |
Output is correct |
22 |
Correct |
1509 ms |
236508 KB |
Output is correct |
23 |
Correct |
1645 ms |
208072 KB |
Output is correct |
24 |
Correct |
1605 ms |
236940 KB |
Output is correct |
25 |
Execution timed out |
4094 ms |
368264 KB |
Time limit exceeded |
26 |
Halted |
0 ms |
0 KB |
- |