#include "walk.h"
#include <bits/stdc++.h>
using namespace std;
struct point {
int x, y, idx;
point() { }
point(int x, int y, int idx) { this->x = x, this->y = y, this->idx = idx; }
bool operator < (const point &r) const {
return x < r.x || (x == r.x && y < r.y);
}
bool operator == (const point &r) const {
return x == r.x && y == r.y;
}
};
long long dijkstra(int s, int g, vector<vector<pair<long long, int>>> G) {
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;
vector<long long> dist(G.size(), -1);
pq.push({0, s}); dist[s] = 0;
while (!pq.empty()) {
auto top = pq.top();
pq.pop();
if (top.first != dist[top.second]) continue;
for (auto v : G[top.second]) {
if (dist[v.second] > top.first + v.first || dist[v.second] == -1) {
dist[v.second] = top.first + v.first;
pq.push({dist[v.second], v.second});
}
}
}
return dist[g];
}
void add_edge(point &x, point &y, vector<vector<pair<long long, int>>> &G) {
G[x.idx].emplace_back(abs(y.x - x.x) + abs(y.y - x.y), y.idx);
G[y.idx].emplace_back(abs(y.x - x.x) + abs(y.y - x.y), x.idx);
return;
}
void build_graph(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int &s, int &g, vector<vector<pair<long long, int>>> &G) {
int n = x.size(), m = y.size();
vector<vector<int>> building(n);
vector<vector<pair<int, int>>> event(n);
building[s].emplace_back(0);
building[g].emplace_back(0);
for (int i = 0; i < m; i++) {
building[l[i]].emplace_back(y[i]);
building[r[i]].emplace_back(y[i]);
event[l[i]].emplace_back(y[i], +1);
if (r[i] + 1 < n) event[r[i] + 1].emplace_back(y[i], -1);
}
multiset<int> alive; //find intersection directly above or below or on start points and endpoints of skywalks
for (int i = 0; i < n; i++) { //proof of correctness:
for (auto &e : event[i]) { //let s = 0 and g = n - 1
if (e.second == +1) alive.insert(e.first); //permuting all possible ways, we can always go right (shortest path)
else alive.erase(alive.find(e.first)); //if there is a backtrack (left) segment, continued by another segment
} //we can always directly go there without going left at all. QED.
vector<int> tmp = building[i]; //as we always go right, x-distance is always the same -> minimize y-distance
for (auto &b : building[i]) { //to minimize, we cannot use the same skywalk twice
if (b == 0) continue; //thus we should only switch only at start and endpoint,
auto it = alive.upper_bound(b); //and if there are start and end point of another segment directly above or below
if (it != alive.end()) tmp.emplace_back(*it); //if we switch to below, we can just switch at the end of the current skywalk
it = alive.lower_bound(b); //if above, switch at new segment start point
if (it != alive.begin()) tmp.emplace_back(*prev(it)); //applying all of this, we only need to use 6 intersections
} //on, directly above, and directly below the start and end points of a skywalk
sort(tmp.begin(), tmp.end());
tmp.resize(unique(tmp.begin(), tmp.end()) - tmp.begin());
while (!tmp.empty() && tmp.back() > h[i]) tmp.pop_back();
building[i] = tmp; //delete double counting
}
alive.clear(); //get intersection points closest to s and g for every skywalks
vector<pair<int, int>> height_building; //observation: there exists a pl (pivot left) and pr (pivot right) such that
vector<pair<int, pair<int, int>>> height_skywalk; //the shortest path = shortest path from s to pl + pl to pr + pr to g
for (int i = 0; i < n; i++) alive.insert(i); //we can model s to pl as only going left -> ignore eerything on the right,
for (int i = 0; i < n; i++) height_building.emplace_back(h[i], i); //and get all shortest path from s to 0
for (int i = 0; i < m; i++) height_skywalk.push_back({y[i], {l[i], r[i]}}); //then we can go from those shortest points from 0 to n
sort(height_building.begin(), height_building.end()); //and then from n to g (model the same, but from g to n-1)
sort(height_skywalk.begin(), height_skywalk.end());
for (int i = 0, loc = 0; i < m; i++) { //also model from s to n-1, and from g to 0 -> thus every possible left-right path is possible
while (loc < n && height_skywalk[i].first > height_building[loc].first) alive.erase(height_building[loc++].second); //(right-right-tight),
if (height_skywalk[i].second.first <= s && s <= height_skywalk[i].second.second) { //(right, right, left), (left, right, tight),
auto it = alive.lower_bound(s); //and (left, right, left). Midpath is always right -> get every point in 0...s and g...n-1 and get their shortest path
building[*it].emplace_back(height_skywalk[i].first); //from s, you can go left or right -> get nearest intersection point for every skywalk
if (it != alive.begin()) building[*prev(it)].emplace_back(height_skywalk[i].first); //like s = 0, g = n-1; you can ignore the opposite side
} //nearest intersection point of every skywalk becomes "startpoints" for those skywalks
if (height_skywalk[i].second.first <= g && g <= height_skywalk[i].second.second) { //ergo for s-right, and for g
auto it = alive.lower_bound(g);
building[*it].emplace_back(height_skywalk[i].first);
if (it != alive.begin()) building[*prev(it)].emplace_back(height_skywalk[i].first);
}
}
//build nodes and edges
vector<point> points; //thus for shortest path from s to g
for (int i = 0; i < n; i++) { //just need 18 intersection points for every skywalk
for (auto &j : building[i]) { //startpoint and endpoint (2), and nearest to s and to e from left and from right (4),
int num = points.size(); //also create intersections directly above or below those intersection points
points.emplace_back(x[i], j, num); //2 * 6 = 18 intersections for every skywalk
}
}
G.resize(points.size());
auto cmpx = [&](const point &x, const point &y) { return x.x < y.x || (x.x == y.x && x.y < y.y); };
auto cmpy = [&](const point &x, const point &y) { return x.y < y.y || (x.y == y.y && x.x < y.x); };
sort(points.begin(), points.end(), cmpx);
for (int i = 0; i < n; i++) {
int lo = lower_bound(points.begin(), points.end(), point(x[i], 0, -1), cmpx) - points.begin();
int hi = upper_bound(points.begin(), points.end(), point(x[i], h[i], -1), cmpx) - points.begin();
for (int j = lo + 1; j < hi; j++) add_edge(points[j - 1], points[j], G);
}
sort(points.begin(), points.end(), cmpy);
for (int i = 0; i < m; i++) {
int lo = lower_bound(points.begin(), points.end(), point(x[l[i]], y[i], -1), cmpy) - points.begin();
int hi = upper_bound(points.begin(), points.end(), point(x[r[i]], y[i], -1), cmpy) - points.begin();
for (int j = lo + 1; j < hi; j++) add_edge(points[j - 1], points[j], G);
}
s = points[lower_bound(points.begin(), points.end(), point(x[s], 0, -1), cmpy) - points.begin()].idx;
g = points[lower_bound(points.begin(), points.end(), point(x[g], 0, -1), cmpy) - points.begin()].idx;
return;
}
long long min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int s, int g) {
vector<vector<pair<long long, int>>> G;
build_graph(x, h, l, r, y, s, g, G);
return dijkstra(s, g, G);
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
256 KB |
Output is correct |
2 |
Correct |
3 ms |
256 KB |
Output is correct |
3 |
Correct |
2 ms |
376 KB |
Output is correct |
4 |
Correct |
2 ms |
252 KB |
Output is correct |
5 |
Correct |
3 ms |
376 KB |
Output is correct |
6 |
Correct |
3 ms |
376 KB |
Output is correct |
7 |
Correct |
2 ms |
380 KB |
Output is correct |
8 |
Correct |
2 ms |
376 KB |
Output is correct |
9 |
Correct |
2 ms |
376 KB |
Output is correct |
10 |
Correct |
3 ms |
376 KB |
Output is correct |
11 |
Correct |
3 ms |
376 KB |
Output is correct |
12 |
Correct |
3 ms |
376 KB |
Output is correct |
13 |
Correct |
3 ms |
376 KB |
Output is correct |
14 |
Correct |
2 ms |
376 KB |
Output is correct |
15 |
Correct |
2 ms |
256 KB |
Output is correct |
16 |
Correct |
3 ms |
376 KB |
Output is correct |
17 |
Correct |
2 ms |
376 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
2 ms |
376 KB |
Output is correct |
3 |
Correct |
921 ms |
94144 KB |
Output is correct |
4 |
Correct |
1070 ms |
91872 KB |
Output is correct |
5 |
Correct |
724 ms |
71352 KB |
Output is correct |
6 |
Correct |
753 ms |
71852 KB |
Output is correct |
7 |
Correct |
863 ms |
71168 KB |
Output is correct |
8 |
Correct |
1006 ms |
103396 KB |
Output is correct |
9 |
Correct |
872 ms |
84824 KB |
Output is correct |
10 |
Correct |
1085 ms |
97956 KB |
Output is correct |
11 |
Correct |
742 ms |
67492 KB |
Output is correct |
12 |
Correct |
557 ms |
40820 KB |
Output is correct |
13 |
Correct |
1095 ms |
101276 KB |
Output is correct |
14 |
Correct |
811 ms |
80712 KB |
Output is correct |
15 |
Correct |
713 ms |
60788 KB |
Output is correct |
16 |
Correct |
525 ms |
44384 KB |
Output is correct |
17 |
Correct |
510 ms |
41272 KB |
Output is correct |
18 |
Correct |
1099 ms |
116052 KB |
Output is correct |
19 |
Correct |
23 ms |
4304 KB |
Output is correct |
20 |
Correct |
259 ms |
40876 KB |
Output is correct |
21 |
Correct |
518 ms |
40460 KB |
Output is correct |
22 |
Correct |
486 ms |
39476 KB |
Output is correct |
23 |
Correct |
928 ms |
72548 KB |
Output is correct |
24 |
Correct |
494 ms |
40516 KB |
Output is correct |
25 |
Correct |
562 ms |
40900 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
144 ms |
14816 KB |
Output is correct |
2 |
Correct |
1204 ms |
129060 KB |
Output is correct |
3 |
Correct |
1285 ms |
134064 KB |
Output is correct |
4 |
Correct |
1546 ms |
134700 KB |
Output is correct |
5 |
Correct |
1695 ms |
138056 KB |
Output is correct |
6 |
Correct |
1607 ms |
135656 KB |
Output is correct |
7 |
Correct |
729 ms |
68740 KB |
Output is correct |
8 |
Correct |
492 ms |
45512 KB |
Output is correct |
9 |
Correct |
1590 ms |
134936 KB |
Output is correct |
10 |
Correct |
754 ms |
69516 KB |
Output is correct |
11 |
Correct |
39 ms |
7644 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
144 ms |
14816 KB |
Output is correct |
2 |
Correct |
1204 ms |
129060 KB |
Output is correct |
3 |
Correct |
1285 ms |
134064 KB |
Output is correct |
4 |
Correct |
1546 ms |
134700 KB |
Output is correct |
5 |
Correct |
1695 ms |
138056 KB |
Output is correct |
6 |
Correct |
1607 ms |
135656 KB |
Output is correct |
7 |
Correct |
729 ms |
68740 KB |
Output is correct |
8 |
Correct |
492 ms |
45512 KB |
Output is correct |
9 |
Correct |
1590 ms |
134936 KB |
Output is correct |
10 |
Correct |
754 ms |
69516 KB |
Output is correct |
11 |
Correct |
39 ms |
7644 KB |
Output is correct |
12 |
Correct |
1343 ms |
133560 KB |
Output is correct |
13 |
Correct |
1350 ms |
133640 KB |
Output is correct |
14 |
Correct |
1719 ms |
138092 KB |
Output is correct |
15 |
Correct |
1118 ms |
100476 KB |
Output is correct |
16 |
Correct |
1174 ms |
105188 KB |
Output is correct |
17 |
Correct |
1392 ms |
134212 KB |
Output is correct |
18 |
Correct |
1105 ms |
100232 KB |
Output is correct |
19 |
Correct |
1179 ms |
104956 KB |
Output is correct |
20 |
Correct |
824 ms |
67616 KB |
Output is correct |
21 |
Correct |
140 ms |
15344 KB |
Output is correct |
22 |
Correct |
948 ms |
99592 KB |
Output is correct |
23 |
Correct |
890 ms |
89488 KB |
Output is correct |
24 |
Correct |
653 ms |
54136 KB |
Output is correct |
25 |
Correct |
898 ms |
81364 KB |
Output is correct |
26 |
Correct |
515 ms |
39400 KB |
Output is correct |
27 |
Correct |
1855 ms |
137476 KB |
Output is correct |
28 |
Correct |
1310 ms |
131360 KB |
Output is correct |
29 |
Correct |
1649 ms |
135608 KB |
Output is correct |
30 |
Correct |
793 ms |
68176 KB |
Output is correct |
31 |
Correct |
1656 ms |
134984 KB |
Output is correct |
32 |
Correct |
573 ms |
51172 KB |
Output is correct |
33 |
Correct |
543 ms |
47800 KB |
Output is correct |
34 |
Correct |
712 ms |
65148 KB |
Output is correct |
35 |
Correct |
740 ms |
62508 KB |
Output is correct |
36 |
Correct |
612 ms |
48612 KB |
Output is correct |
37 |
Correct |
479 ms |
40548 KB |
Output is correct |
38 |
Correct |
534 ms |
39676 KB |
Output is correct |
39 |
Correct |
853 ms |
72644 KB |
Output is correct |
40 |
Correct |
545 ms |
40624 KB |
Output is correct |
41 |
Correct |
552 ms |
40888 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
256 KB |
Output is correct |
2 |
Correct |
3 ms |
256 KB |
Output is correct |
3 |
Correct |
2 ms |
376 KB |
Output is correct |
4 |
Correct |
2 ms |
252 KB |
Output is correct |
5 |
Correct |
3 ms |
376 KB |
Output is correct |
6 |
Correct |
3 ms |
376 KB |
Output is correct |
7 |
Correct |
2 ms |
380 KB |
Output is correct |
8 |
Correct |
2 ms |
376 KB |
Output is correct |
9 |
Correct |
2 ms |
376 KB |
Output is correct |
10 |
Correct |
3 ms |
376 KB |
Output is correct |
11 |
Correct |
3 ms |
376 KB |
Output is correct |
12 |
Correct |
3 ms |
376 KB |
Output is correct |
13 |
Correct |
3 ms |
376 KB |
Output is correct |
14 |
Correct |
2 ms |
376 KB |
Output is correct |
15 |
Correct |
2 ms |
256 KB |
Output is correct |
16 |
Correct |
3 ms |
376 KB |
Output is correct |
17 |
Correct |
2 ms |
376 KB |
Output is correct |
18 |
Correct |
2 ms |
376 KB |
Output is correct |
19 |
Correct |
2 ms |
376 KB |
Output is correct |
20 |
Correct |
921 ms |
94144 KB |
Output is correct |
21 |
Correct |
1070 ms |
91872 KB |
Output is correct |
22 |
Correct |
724 ms |
71352 KB |
Output is correct |
23 |
Correct |
753 ms |
71852 KB |
Output is correct |
24 |
Correct |
863 ms |
71168 KB |
Output is correct |
25 |
Correct |
1006 ms |
103396 KB |
Output is correct |
26 |
Correct |
872 ms |
84824 KB |
Output is correct |
27 |
Correct |
1085 ms |
97956 KB |
Output is correct |
28 |
Correct |
742 ms |
67492 KB |
Output is correct |
29 |
Correct |
557 ms |
40820 KB |
Output is correct |
30 |
Correct |
1095 ms |
101276 KB |
Output is correct |
31 |
Correct |
811 ms |
80712 KB |
Output is correct |
32 |
Correct |
713 ms |
60788 KB |
Output is correct |
33 |
Correct |
525 ms |
44384 KB |
Output is correct |
34 |
Correct |
510 ms |
41272 KB |
Output is correct |
35 |
Correct |
1099 ms |
116052 KB |
Output is correct |
36 |
Correct |
23 ms |
4304 KB |
Output is correct |
37 |
Correct |
259 ms |
40876 KB |
Output is correct |
38 |
Correct |
518 ms |
40460 KB |
Output is correct |
39 |
Correct |
486 ms |
39476 KB |
Output is correct |
40 |
Correct |
928 ms |
72548 KB |
Output is correct |
41 |
Correct |
494 ms |
40516 KB |
Output is correct |
42 |
Correct |
562 ms |
40900 KB |
Output is correct |
43 |
Correct |
144 ms |
14816 KB |
Output is correct |
44 |
Correct |
1204 ms |
129060 KB |
Output is correct |
45 |
Correct |
1285 ms |
134064 KB |
Output is correct |
46 |
Correct |
1546 ms |
134700 KB |
Output is correct |
47 |
Correct |
1695 ms |
138056 KB |
Output is correct |
48 |
Correct |
1607 ms |
135656 KB |
Output is correct |
49 |
Correct |
729 ms |
68740 KB |
Output is correct |
50 |
Correct |
492 ms |
45512 KB |
Output is correct |
51 |
Correct |
1590 ms |
134936 KB |
Output is correct |
52 |
Correct |
754 ms |
69516 KB |
Output is correct |
53 |
Correct |
39 ms |
7644 KB |
Output is correct |
54 |
Correct |
1343 ms |
133560 KB |
Output is correct |
55 |
Correct |
1350 ms |
133640 KB |
Output is correct |
56 |
Correct |
1719 ms |
138092 KB |
Output is correct |
57 |
Correct |
1118 ms |
100476 KB |
Output is correct |
58 |
Correct |
1174 ms |
105188 KB |
Output is correct |
59 |
Correct |
1392 ms |
134212 KB |
Output is correct |
60 |
Correct |
1105 ms |
100232 KB |
Output is correct |
61 |
Correct |
1179 ms |
104956 KB |
Output is correct |
62 |
Correct |
824 ms |
67616 KB |
Output is correct |
63 |
Correct |
140 ms |
15344 KB |
Output is correct |
64 |
Correct |
948 ms |
99592 KB |
Output is correct |
65 |
Correct |
890 ms |
89488 KB |
Output is correct |
66 |
Correct |
653 ms |
54136 KB |
Output is correct |
67 |
Correct |
898 ms |
81364 KB |
Output is correct |
68 |
Correct |
515 ms |
39400 KB |
Output is correct |
69 |
Correct |
1855 ms |
137476 KB |
Output is correct |
70 |
Correct |
1310 ms |
131360 KB |
Output is correct |
71 |
Correct |
1649 ms |
135608 KB |
Output is correct |
72 |
Correct |
793 ms |
68176 KB |
Output is correct |
73 |
Correct |
1656 ms |
134984 KB |
Output is correct |
74 |
Correct |
573 ms |
51172 KB |
Output is correct |
75 |
Correct |
543 ms |
47800 KB |
Output is correct |
76 |
Correct |
712 ms |
65148 KB |
Output is correct |
77 |
Correct |
740 ms |
62508 KB |
Output is correct |
78 |
Correct |
612 ms |
48612 KB |
Output is correct |
79 |
Correct |
479 ms |
40548 KB |
Output is correct |
80 |
Correct |
534 ms |
39676 KB |
Output is correct |
81 |
Correct |
853 ms |
72644 KB |
Output is correct |
82 |
Correct |
545 ms |
40624 KB |
Output is correct |
83 |
Correct |
552 ms |
40888 KB |
Output is correct |
84 |
Correct |
125 ms |
12464 KB |
Output is correct |
85 |
Correct |
1370 ms |
138232 KB |
Output is correct |
86 |
Correct |
2015 ms |
171648 KB |
Output is correct |
87 |
Correct |
146 ms |
20564 KB |
Output is correct |
88 |
Correct |
183 ms |
18384 KB |
Output is correct |
89 |
Correct |
135 ms |
20588 KB |
Output is correct |
90 |
Correct |
44 ms |
5756 KB |
Output is correct |
91 |
Correct |
4 ms |
632 KB |
Output is correct |
92 |
Correct |
39 ms |
5000 KB |
Output is correct |
93 |
Correct |
564 ms |
47092 KB |
Output is correct |
94 |
Correct |
135 ms |
15348 KB |
Output is correct |
95 |
Correct |
1149 ms |
105636 KB |
Output is correct |
96 |
Correct |
899 ms |
91832 KB |
Output is correct |
97 |
Correct |
765 ms |
72472 KB |
Output is correct |
98 |
Correct |
815 ms |
81436 KB |
Output is correct |
99 |
Correct |
2431 ms |
202280 KB |
Output is correct |
100 |
Correct |
1541 ms |
134068 KB |
Output is correct |
101 |
Correct |
1882 ms |
151828 KB |
Output is correct |
102 |
Correct |
798 ms |
68532 KB |
Output is correct |
103 |
Correct |
585 ms |
53688 KB |
Output is correct |
104 |
Correct |
556 ms |
47844 KB |
Output is correct |
105 |
Correct |
715 ms |
64824 KB |
Output is correct |
106 |
Correct |
726 ms |
64400 KB |
Output is correct |
107 |
Correct |
785 ms |
66316 KB |
Output is correct |
108 |
Correct |
105 ms |
10556 KB |
Output is correct |
109 |
Correct |
1322 ms |
104772 KB |
Output is correct |
110 |
Correct |
1508 ms |
132884 KB |
Output is correct |
111 |
Correct |
1218 ms |
134008 KB |
Output is correct |
112 |
Correct |
765 ms |
61796 KB |
Output is correct |
113 |
Correct |
662 ms |
55636 KB |
Output is correct |