#include "walk.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>
#include <queue>
#include <stack>
#include <map>
typedef long long llong;
const int MAXN = 100000 + 10;
const int INTERSECTIONS = 10 + 5;
const llong INF = 1e18;
const int INTINF = 1e9;
const int MAXLOG = 17;
namespace
{
int cnt;
int n, m;
int s, t;
int h[MAXN];
int x[MAXN];
int left[MAXN];
int right[MAXN];
int y[MAXN];
std::map <int,int> map[MAXN];
bool vis[MAXN * INTERSECTIONS];
llong dist[MAXN * INTERSECTIONS];
std::vector <std::pair <int,int>> g[MAXN * INTERSECTIONS];
int cntNodes;
}
struct Sparse
{
int sparse[MAXLOG][MAXN];
int getLOG[MAXN];
void build(int a[])
{
for (int i = 1 ; i <= n ; ++i)
{
sparse[0][i] = a[i];
}
for (int lg = 1 ; (1 << lg) <= n ; ++lg)
{
for (int i = 1 ; i + (1 << lg) - 1 <= n ; ++i)
{
sparse[lg][i] = std::max(sparse[lg - 1][i], sparse[lg - 1][i + (1 << lg - 1)]);
}
}
for (int i = 1 ; i <= n ; ++i)
{
getLOG[i] = getLOG[i - 1];
if ((1 << getLOG[i] + 1) < i) getLOG[i]++;
}
}
int findMAX(int l, int r)
{
int lg = getLOG[r - l + 1];
return std::max(sparse[lg][l], sparse[lg][r - (1 << lg) + 1]);
}
};
Sparse sparse;
llong solve()
{
for (int i = 1 ; i <= n ; ++i)
{
map[i][0] = ++cnt;
}
sparse.build(h);
for (int i = 1 ; i <= m ; ++i)
{
int prev = left[i];
if (map[left[i]][y[i]] == 0)
{
map[left[i]][y[i]] = ++cnt;
}
while (prev < right[i])
{
int l = prev, r = right[i] + 1, mid;
while (l < r - 1)
{
mid = l + r >> 1;
if (sparse.findMAX(prev + 1, mid) < y[i]) l = mid;
else r = mid;
}
if (map[r][y[i]] == 0)
{
map[r][y[i]] = ++cnt;
}
// std::cout << "here: " << prev << ' ' << r << ' ' << y[i] << '\n';
g[map[prev][y[i]]].push_back({map[r][y[i]], x[r] - x[prev]});
g[map[r][y[i]]].push_back({map[prev][y[i]], x[r] - x[prev]});
prev = r;
}
}
for (int i = 1 ; i <= n ; ++i)
{
auto prev = map[i].begin();
for (auto curr = std::next(map[i].begin()) ; curr != map[i].end() ; ++curr)
{
// std::cout << "edge ver: " << x[i] << ' ' << prev->first << ' ' << x[i] << ' ' << curr->first << '\n';
g[prev->second].push_back({curr->second, curr->first - prev->first});
g[curr->second].push_back({prev->second, curr->first - prev->first});
prev = curr;
}
}
std::priority_queue <std::pair <llong,int>> pq;
std::fill(dist + 1, dist + 1 + cnt, INF);
pq.push({0, map[s][0]});
dist[map[s][0]] = 0;
while (pq.size())
{
auto [d, node] = pq.top();
pq.pop();
if (vis[node])
{
continue;
}
vis[node] = true;
for (const auto &[u, ed] : g[node])
{
if (dist[u] > dist[node] + ed)
{
dist[u] = dist[node] + ed;
pq.push({-dist[u], u});
}
}
}
return (dist[map[t][0]] == INF ? -1 : dist[map[t][0]]);
}
llong dp[MAXN];
llong solveSpecial()
{
for (int i = 1 ; i <= m ; ++i)
{
if (left[i] == 1)
{
dp[i] = y[i];
} else
{
dp[i] = INF;
for (int j = 1 ; j < i ; ++j)
{
if (right[j] >= left[i])
{
if (y[j] < y[i])
{
dp[i] = std::min(dp[i], dp[j] + x[left[i]] - x[left[j]] + y[i] - y[j]);
}
if (y[j] >= y[i] && y[j] <= h[left[i]])
{
dp[i] = std::min(dp[i], dp[j] + x[left[i]] - x[left[j]] + y[j] - y[i]);
}
}
}
}
}
llong ans = INF;
for (int i = 1 ; i <= m ; ++i)
{
if (right[i] == n)
{
ans = std::min(ans, dp[i] + x[n] - x[left[i]] + y[i]);
}
}
return ans;
}
long long min_distance(std::vector<int> x, std::vector<int> h, std::vector<int> l, std::vector<int> r, std::vector<int> y, int s, int t)
{
n = x.size();
m = l.size();
::s = s + 1; ::t = t + 1;
for (int i = 0 ; i < n ; ++i)
{
::h[i + 1] = h[i];
::x[i + 1] = x[i];
}
std::vector <int> perm(m);
std::iota(perm.begin(), perm.end(), 0);
std::sort(perm.begin(), perm.end(), [&](int x, int y)
{
return l[x] < l[y];
});
for (int i = 0 ; i < m ; ++i)
{
::left[i + 1] = l[perm[i]] + 1;
::right[i + 1] = r[perm[i]] + 1;
::y[i + 1] = y[perm[i]];
}
// if (::s == 1 && ::t == n) return solveSpecial();
return solve();
}
Compilation message
walk.cpp: In member function 'void Sparse::build(int*)':
walk.cpp:51:89: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
51 | sparse[lg][i] = std::max(sparse[lg - 1][i], sparse[lg - 1][i + (1 << lg - 1)]);
| ~~~^~~
walk.cpp:58:33: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
58 | if ((1 << getLOG[i] + 1) < i) getLOG[i]++;
| ~~~~~~~~~~^~~
walk.cpp: In function 'llong solve()':
walk.cpp:91:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
91 | mid = l + r >> 1;
| ~~^~~
walk.cpp: At global scope:
walk.cpp:32:9: warning: '{anonymous}::cntNodes' defined but not used [-Wunused-variable]
32 | int cntNodes;
| ^~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
11 ms |
43608 KB |
Output is correct |
2 |
Correct |
11 ms |
43356 KB |
Output is correct |
3 |
Correct |
11 ms |
43156 KB |
Output is correct |
4 |
Correct |
11 ms |
43356 KB |
Output is correct |
5 |
Correct |
12 ms |
43376 KB |
Output is correct |
6 |
Correct |
12 ms |
43404 KB |
Output is correct |
7 |
Correct |
11 ms |
43356 KB |
Output is correct |
8 |
Correct |
12 ms |
43356 KB |
Output is correct |
9 |
Correct |
11 ms |
43352 KB |
Output is correct |
10 |
Correct |
12 ms |
43356 KB |
Output is correct |
11 |
Correct |
12 ms |
43356 KB |
Output is correct |
12 |
Correct |
10 ms |
43356 KB |
Output is correct |
13 |
Correct |
11 ms |
43352 KB |
Output is correct |
14 |
Correct |
11 ms |
43352 KB |
Output is correct |
15 |
Correct |
12 ms |
43356 KB |
Output is correct |
16 |
Correct |
11 ms |
43356 KB |
Output is correct |
17 |
Correct |
12 ms |
43264 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
11 ms |
43356 KB |
Output is correct |
2 |
Correct |
11 ms |
43356 KB |
Output is correct |
3 |
Correct |
509 ms |
137296 KB |
Output is correct |
4 |
Correct |
417 ms |
151128 KB |
Output is correct |
5 |
Correct |
214 ms |
136580 KB |
Output is correct |
6 |
Correct |
202 ms |
126028 KB |
Output is correct |
7 |
Correct |
218 ms |
136532 KB |
Output is correct |
8 |
Correct |
653 ms |
164164 KB |
Output is correct |
9 |
Correct |
236 ms |
134224 KB |
Output is correct |
10 |
Correct |
558 ms |
191260 KB |
Output is correct |
11 |
Correct |
211 ms |
95316 KB |
Output is correct |
12 |
Correct |
105 ms |
82256 KB |
Output is correct |
13 |
Correct |
413 ms |
173396 KB |
Output is correct |
14 |
Correct |
92 ms |
84128 KB |
Output is correct |
15 |
Correct |
112 ms |
85072 KB |
Output is correct |
16 |
Correct |
120 ms |
87632 KB |
Output is correct |
17 |
Correct |
102 ms |
83664 KB |
Output is correct |
18 |
Correct |
262 ms |
87240 KB |
Output is correct |
19 |
Correct |
21 ms |
45272 KB |
Output is correct |
20 |
Correct |
57 ms |
63824 KB |
Output is correct |
21 |
Correct |
96 ms |
82412 KB |
Output is correct |
22 |
Correct |
103 ms |
85088 KB |
Output is correct |
23 |
Correct |
156 ms |
93376 KB |
Output is correct |
24 |
Correct |
120 ms |
85136 KB |
Output is correct |
25 |
Correct |
114 ms |
84800 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
44 ms |
54744 KB |
Output is correct |
2 |
Runtime error |
1243 ms |
447676 KB |
Execution killed with signal 11 |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
44 ms |
54744 KB |
Output is correct |
2 |
Runtime error |
1243 ms |
447676 KB |
Execution killed with signal 11 |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
11 ms |
43608 KB |
Output is correct |
2 |
Correct |
11 ms |
43356 KB |
Output is correct |
3 |
Correct |
11 ms |
43156 KB |
Output is correct |
4 |
Correct |
11 ms |
43356 KB |
Output is correct |
5 |
Correct |
12 ms |
43376 KB |
Output is correct |
6 |
Correct |
12 ms |
43404 KB |
Output is correct |
7 |
Correct |
11 ms |
43356 KB |
Output is correct |
8 |
Correct |
12 ms |
43356 KB |
Output is correct |
9 |
Correct |
11 ms |
43352 KB |
Output is correct |
10 |
Correct |
12 ms |
43356 KB |
Output is correct |
11 |
Correct |
12 ms |
43356 KB |
Output is correct |
12 |
Correct |
10 ms |
43356 KB |
Output is correct |
13 |
Correct |
11 ms |
43352 KB |
Output is correct |
14 |
Correct |
11 ms |
43352 KB |
Output is correct |
15 |
Correct |
12 ms |
43356 KB |
Output is correct |
16 |
Correct |
11 ms |
43356 KB |
Output is correct |
17 |
Correct |
12 ms |
43264 KB |
Output is correct |
18 |
Correct |
11 ms |
43356 KB |
Output is correct |
19 |
Correct |
11 ms |
43356 KB |
Output is correct |
20 |
Correct |
509 ms |
137296 KB |
Output is correct |
21 |
Correct |
417 ms |
151128 KB |
Output is correct |
22 |
Correct |
214 ms |
136580 KB |
Output is correct |
23 |
Correct |
202 ms |
126028 KB |
Output is correct |
24 |
Correct |
218 ms |
136532 KB |
Output is correct |
25 |
Correct |
653 ms |
164164 KB |
Output is correct |
26 |
Correct |
236 ms |
134224 KB |
Output is correct |
27 |
Correct |
558 ms |
191260 KB |
Output is correct |
28 |
Correct |
211 ms |
95316 KB |
Output is correct |
29 |
Correct |
105 ms |
82256 KB |
Output is correct |
30 |
Correct |
413 ms |
173396 KB |
Output is correct |
31 |
Correct |
92 ms |
84128 KB |
Output is correct |
32 |
Correct |
112 ms |
85072 KB |
Output is correct |
33 |
Correct |
120 ms |
87632 KB |
Output is correct |
34 |
Correct |
102 ms |
83664 KB |
Output is correct |
35 |
Correct |
262 ms |
87240 KB |
Output is correct |
36 |
Correct |
21 ms |
45272 KB |
Output is correct |
37 |
Correct |
57 ms |
63824 KB |
Output is correct |
38 |
Correct |
96 ms |
82412 KB |
Output is correct |
39 |
Correct |
103 ms |
85088 KB |
Output is correct |
40 |
Correct |
156 ms |
93376 KB |
Output is correct |
41 |
Correct |
120 ms |
85136 KB |
Output is correct |
42 |
Correct |
114 ms |
84800 KB |
Output is correct |
43 |
Correct |
44 ms |
54744 KB |
Output is correct |
44 |
Runtime error |
1243 ms |
447676 KB |
Execution killed with signal 11 |
45 |
Halted |
0 ms |
0 KB |
- |