#include "wiring.h"
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rep2(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define rrep2(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); --i)
#define all(v) begin(v), end(v)
using namespace std;
template<class T, class U> bool chmin(T& a, const U& b) { return a > b ? a = b, true : false; }
template<class T, class U> bool chmax(T& a, const U& b) { return a < b ? a = b, true : false; }
using ll = long long;
constexpr ll inf = 1e18;
class LiChaoTree {
struct Line {
ll a, b;
Line(ll a, ll b) : a(a), b(b) {}
ll get(ll x) const { return a * x + b; }
};
int n;
vector<Line> seg;
void add_line(Line line, int k, int l, int r) {
int m = (l + r) / 2;
ll lx = seg[k].get(l), rx = seg[k].get(r - 1), mx = seg[k].get(m);
ll ly = line.get(l), ry = line.get(r - 1), my = line.get(m);
if (lx <= ly && rx <= ry) return;
if (lx >= ly && rx >= ry) {
seg[k] = line;
return;
}
if (mx > my) {
swap(seg[k], line);
swap(mx, my);
swap(lx, ly);
swap(rx, ry);
}
if (lx > ly) {
add_line(line, 2 * k, l, m);
}
else if (rx > ry) {
add_line(line, 2 * k + 1, m, r);
}
}
void add_segment(Line line, int a, int b, int k, int l, int r) {
if (b <= l || r <= a) return;
if (a <= l && r <= b) {
add_line(line, k, l, r);
return;
}
int m = (l + r) / 2;
add_segment(line, a, b, 2 * k, l, m);
add_segment(line, a, b, 2 * k + 1, m, r);
}
public:
LiChaoTree(int n_) {
n = 1;
while (n < n_) n <<= 1;
seg.assign(2 * n, Line(0, inf));
}
void add_segment(int l, int r, ll a, ll b) {
add_segment(Line(a, b), l, r, 1, 0, n);
}
ll get(int x) {
int k = x + n;
ll res = inf;
while (k > 0) {
chmin(res, seg[k].get(x));
k >>= 1;
}
return res;
}
};
long long min_total_length(std::vector<int> r, std::vector<int> b) {
int N = r.size(), M = b.size();
vector<pair<ll, int>> A(N + M);
rep (i, N) A[i] = {r[i], 0};
rep (i, M) A[N + i] = {b[i], 1};
sort(all(A));
vector<int> nxt(N + M + 1);
nxt[N + M] = N + M;
nxt[N + M - 1] = N + M;
rrep (i, N + M - 1) {
if (A[i].second == A[i + 1].second) nxt[i] = nxt[i + 1];
else nxt[i] = i + 1;
}
vector<ll> cum1(N + M), cum2(N + M);
rep (i, N + M - 1) cum1[i + 1] = cum1[i] + (A[i + 1].first - A[i].first) * i;
LiChaoTree lct(N + M + 1);
vector<ll> dp(N + M + 1, inf);
dp[0] = 0;
rep (i, N + M) {
int m = nxt[i];
int r = nxt[m];
if (m != r) {
ll tmp1 = (dp[i] + cum1[m] * 2 - cum1[i] + (A[m].first - A[i].first) * (-i + 1));
ll tmp2 = (dp[i] + cum1[m - 1] * 2 - cum1[i] + (A[m - 1].first - A[i].first) * (-i + 1));
int mm = clamp(2 * m - i, m, r);
lct.add_segment(m, mm, -A[m].first, tmp1);
lct.add_segment(mm, r, -A[m - 1].first, tmp2);
}
if (i != 0 && A[i].second != A[i - 1].second) {
ll tmp = dp[i] + cum1[i - 1];
lct.add_segment(i, m, -A[i - 1].first, tmp);
}
dp[i + 1] = lct.get(i) + A[i].first * i - cum1[i];
}
return dp[N + M];
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
0 ms |
348 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
1 ms |
348 KB |
Output is correct |
11 |
Correct |
1 ms |
348 KB |
Output is correct |
12 |
Correct |
0 ms |
344 KB |
Output is correct |
13 |
Correct |
1 ms |
436 KB |
Output is correct |
14 |
Correct |
1 ms |
348 KB |
Output is correct |
15 |
Correct |
0 ms |
348 KB |
Output is correct |
16 |
Correct |
1 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
46 ms |
17496 KB |
Output is correct |
4 |
Correct |
52 ms |
17500 KB |
Output is correct |
5 |
Correct |
39 ms |
17492 KB |
Output is correct |
6 |
Correct |
71 ms |
20560 KB |
Output is correct |
7 |
Correct |
59 ms |
20568 KB |
Output is correct |
8 |
Correct |
58 ms |
20560 KB |
Output is correct |
9 |
Correct |
58 ms |
20564 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
344 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
78 ms |
20760 KB |
Output is correct |
4 |
Correct |
77 ms |
20304 KB |
Output is correct |
5 |
Correct |
0 ms |
344 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
0 ms |
348 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
0 ms |
348 KB |
Output is correct |
11 |
Correct |
1 ms |
348 KB |
Output is correct |
12 |
Correct |
0 ms |
348 KB |
Output is correct |
13 |
Correct |
0 ms |
348 KB |
Output is correct |
14 |
Correct |
0 ms |
348 KB |
Output is correct |
15 |
Correct |
0 ms |
348 KB |
Output is correct |
16 |
Correct |
1 ms |
348 KB |
Output is correct |
17 |
Correct |
0 ms |
348 KB |
Output is correct |
18 |
Correct |
78 ms |
20564 KB |
Output is correct |
19 |
Correct |
76 ms |
20572 KB |
Output is correct |
20 |
Correct |
80 ms |
20560 KB |
Output is correct |
21 |
Correct |
75 ms |
20572 KB |
Output is correct |
22 |
Correct |
79 ms |
20748 KB |
Output is correct |
23 |
Correct |
78 ms |
20560 KB |
Output is correct |
24 |
Correct |
78 ms |
20640 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
77 ms |
20084 KB |
Output is correct |
3 |
Correct |
78 ms |
20084 KB |
Output is correct |
4 |
Correct |
75 ms |
20020 KB |
Output is correct |
5 |
Correct |
72 ms |
20052 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
0 ms |
348 KB |
Output is correct |
8 |
Correct |
1 ms |
344 KB |
Output is correct |
9 |
Correct |
1 ms |
348 KB |
Output is correct |
10 |
Correct |
0 ms |
348 KB |
Output is correct |
11 |
Correct |
0 ms |
348 KB |
Output is correct |
12 |
Correct |
0 ms |
348 KB |
Output is correct |
13 |
Correct |
0 ms |
348 KB |
Output is correct |
14 |
Correct |
0 ms |
348 KB |
Output is correct |
15 |
Correct |
1 ms |
440 KB |
Output is correct |
16 |
Correct |
0 ms |
348 KB |
Output is correct |
17 |
Correct |
0 ms |
348 KB |
Output is correct |
18 |
Correct |
83 ms |
19896 KB |
Output is correct |
19 |
Correct |
106 ms |
20048 KB |
Output is correct |
20 |
Correct |
78 ms |
20056 KB |
Output is correct |
21 |
Correct |
91 ms |
20084 KB |
Output is correct |
22 |
Correct |
77 ms |
20088 KB |
Output is correct |
23 |
Correct |
76 ms |
20084 KB |
Output is correct |
24 |
Correct |
72 ms |
19964 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
0 ms |
348 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
1 ms |
348 KB |
Output is correct |
11 |
Correct |
1 ms |
348 KB |
Output is correct |
12 |
Correct |
0 ms |
344 KB |
Output is correct |
13 |
Correct |
1 ms |
436 KB |
Output is correct |
14 |
Correct |
1 ms |
348 KB |
Output is correct |
15 |
Correct |
0 ms |
348 KB |
Output is correct |
16 |
Correct |
1 ms |
348 KB |
Output is correct |
17 |
Correct |
0 ms |
348 KB |
Output is correct |
18 |
Correct |
0 ms |
348 KB |
Output is correct |
19 |
Correct |
46 ms |
17496 KB |
Output is correct |
20 |
Correct |
52 ms |
17500 KB |
Output is correct |
21 |
Correct |
39 ms |
17492 KB |
Output is correct |
22 |
Correct |
71 ms |
20560 KB |
Output is correct |
23 |
Correct |
59 ms |
20568 KB |
Output is correct |
24 |
Correct |
58 ms |
20560 KB |
Output is correct |
25 |
Correct |
58 ms |
20564 KB |
Output is correct |
26 |
Correct |
1 ms |
344 KB |
Output is correct |
27 |
Correct |
1 ms |
348 KB |
Output is correct |
28 |
Correct |
78 ms |
20760 KB |
Output is correct |
29 |
Correct |
77 ms |
20304 KB |
Output is correct |
30 |
Correct |
0 ms |
344 KB |
Output is correct |
31 |
Correct |
0 ms |
348 KB |
Output is correct |
32 |
Correct |
0 ms |
348 KB |
Output is correct |
33 |
Correct |
0 ms |
348 KB |
Output is correct |
34 |
Correct |
0 ms |
348 KB |
Output is correct |
35 |
Correct |
0 ms |
348 KB |
Output is correct |
36 |
Correct |
1 ms |
348 KB |
Output is correct |
37 |
Correct |
0 ms |
348 KB |
Output is correct |
38 |
Correct |
0 ms |
348 KB |
Output is correct |
39 |
Correct |
0 ms |
348 KB |
Output is correct |
40 |
Correct |
0 ms |
348 KB |
Output is correct |
41 |
Correct |
1 ms |
348 KB |
Output is correct |
42 |
Correct |
0 ms |
348 KB |
Output is correct |
43 |
Correct |
78 ms |
20564 KB |
Output is correct |
44 |
Correct |
76 ms |
20572 KB |
Output is correct |
45 |
Correct |
80 ms |
20560 KB |
Output is correct |
46 |
Correct |
75 ms |
20572 KB |
Output is correct |
47 |
Correct |
79 ms |
20748 KB |
Output is correct |
48 |
Correct |
78 ms |
20560 KB |
Output is correct |
49 |
Correct |
78 ms |
20640 KB |
Output is correct |
50 |
Correct |
0 ms |
348 KB |
Output is correct |
51 |
Correct |
77 ms |
20084 KB |
Output is correct |
52 |
Correct |
78 ms |
20084 KB |
Output is correct |
53 |
Correct |
75 ms |
20020 KB |
Output is correct |
54 |
Correct |
72 ms |
20052 KB |
Output is correct |
55 |
Correct |
0 ms |
348 KB |
Output is correct |
56 |
Correct |
0 ms |
348 KB |
Output is correct |
57 |
Correct |
1 ms |
344 KB |
Output is correct |
58 |
Correct |
1 ms |
348 KB |
Output is correct |
59 |
Correct |
0 ms |
348 KB |
Output is correct |
60 |
Correct |
0 ms |
348 KB |
Output is correct |
61 |
Correct |
0 ms |
348 KB |
Output is correct |
62 |
Correct |
0 ms |
348 KB |
Output is correct |
63 |
Correct |
0 ms |
348 KB |
Output is correct |
64 |
Correct |
1 ms |
440 KB |
Output is correct |
65 |
Correct |
0 ms |
348 KB |
Output is correct |
66 |
Correct |
0 ms |
348 KB |
Output is correct |
67 |
Correct |
83 ms |
19896 KB |
Output is correct |
68 |
Correct |
106 ms |
20048 KB |
Output is correct |
69 |
Correct |
78 ms |
20056 KB |
Output is correct |
70 |
Correct |
91 ms |
20084 KB |
Output is correct |
71 |
Correct |
77 ms |
20088 KB |
Output is correct |
72 |
Correct |
76 ms |
20084 KB |
Output is correct |
73 |
Correct |
72 ms |
19964 KB |
Output is correct |
74 |
Correct |
76 ms |
20528 KB |
Output is correct |
75 |
Correct |
77 ms |
20312 KB |
Output is correct |
76 |
Correct |
76 ms |
20564 KB |
Output is correct |
77 |
Correct |
84 ms |
20060 KB |
Output is correct |
78 |
Correct |
77 ms |
20060 KB |
Output is correct |
79 |
Correct |
78 ms |
20176 KB |
Output is correct |
80 |
Correct |
82 ms |
20044 KB |
Output is correct |
81 |
Correct |
66 ms |
20152 KB |
Output is correct |
82 |
Correct |
67 ms |
20048 KB |
Output is correct |
83 |
Correct |
83 ms |
20304 KB |
Output is correct |
84 |
Correct |
69 ms |
20520 KB |
Output is correct |
85 |
Correct |
79 ms |
20556 KB |
Output is correct |
86 |
Correct |
79 ms |
20560 KB |
Output is correct |
87 |
Correct |
74 ms |
20560 KB |
Output is correct |
88 |
Correct |
80 ms |
20568 KB |
Output is correct |
89 |
Correct |
78 ms |
20660 KB |
Output is correct |
90 |
Correct |
93 ms |
20532 KB |
Output is correct |
91 |
Correct |
74 ms |
20568 KB |
Output is correct |
92 |
Correct |
78 ms |
20764 KB |
Output is correct |
93 |
Correct |
80 ms |
20568 KB |
Output is correct |
94 |
Correct |
77 ms |
20564 KB |
Output is correct |
95 |
Correct |
87 ms |
20564 KB |
Output is correct |
96 |
Correct |
75 ms |
20568 KB |
Output is correct |
97 |
Correct |
78 ms |
20760 KB |
Output is correct |
98 |
Correct |
96 ms |
20656 KB |
Output is correct |
99 |
Correct |
82 ms |
20564 KB |
Output is correct |
100 |
Correct |
110 ms |
20568 KB |
Output is correct |
101 |
Correct |
80 ms |
20808 KB |
Output is correct |
102 |
Correct |
83 ms |
20560 KB |
Output is correct |