#include "meetings.h"
#include <algorithm>
#include <functional>
using namespace std;
typedef long long llong;
typedef pair<int, int> pii;
int n;
const llong inf = 1e18;
vector<llong> ans;
pii mx[1 << 21];
struct query {
int i, l, r;
query(int i, int l, int r) : i(i), l(l), r(r) {}
};
struct line {
llong m, b;
llong get(int x) const {
return m * x + b;
}
line() {}
line(llong m, llong b) : m(m), b(b) {}
};
struct node {
llong lz;
line l;
llong get(int x) const {
return l.get(x);
}
} seg[1 << 21];
vector<query> qs[750001];
pii arr[750001];
void init(int i, int s, int e) {
seg[i].l = line(0, inf);
seg[i].lz = 0;
if (s == e) {
mx[i] = arr[s];
return;
}
int m = (s + e) / 2;
init(i << 1, s, m);
init(i << 1 | 1, m + 1, e);
mx[i] = max(mx[i << 1], mx[i << 1 | 1]);
}
pii getMax(int i, int s, int e, int x, int y) {
if (e < x || y < s) return pii(0, 0);
if (x <= s && e <= y) return mx[i];
int m = (s + e) / 2;
return max(getMax(i << 1, s, m, x, y), getMax(i << 1 | 1, m + 1, e, x, y));
}
void update(int i, int s, int e, int x, int y, line l) {
if (e < x || y < s) return;
l.b -= seg[i].lz;
int m = (s + e) / 2;
if (x <= s && e <= y) {
bool A = seg[i].l.get(s) < l.get(s);
bool B = seg[i].l.get(m) < l.get(m);
if (!B) swap(seg[i].l, l);
if (s == e) return;
if (A != B) update(i << 1, s, m, x, y, l);
else update(i << 1 | 1, m + 1, e, x, y, l);
return;
}
update(i << 1, s, m, x, y, l);
update(i << 1 | 1, m + 1, e, x, y, l);
}
void add(int i, int s, int e, int x, int y, llong v) {
if (e < x || y < s) return;
if (x <= s && e <= y) {
seg[i].lz += v;
return;
}
int m = (s + e) / 2;
add(i << 1, s, m, x, y, v);
add(i << 1 | 1, m + 1, e, x, y, v);
}
llong get(int i, int s, int e, int x) {
llong ret = seg[i].get(x);
if (s == e) return ret + seg[i].lz;
int m = (s + e) / 2;
if (x <= m) return min(ret, get(i << 1, s, m, x)) + seg[i].lz;
return min(ret, get(i << 1 | 1, m + 1, e, x)) + seg[i].lz;
}
void getQuery(int s, int e) {
if (s > e) return;
int m = abs(getMax(1, 1, n, s, e).second);
getQuery(s, m - 1);
getQuery(m + 1, e);
for (query q : qs[m]) {
llong R = m < q.r ? get(1, 1, n, q.r) : 0;
ans[q.i] = min(ans[q.i], R + (m - q.l + 1ll) * arr[m].first);
}
add(1, 1, n, m, e, (m - s + 1ll) * arr[m].first);
llong Lm = s < m ? get(1, 1, n, m - 1) : 0;
line l(arr[m].first, Lm + (1ll - m) * arr[m].first);
update(1, 1, n, m, e, l);
}
vector<llong> minimum_costs(vector<int> H, vector<int> L, vector<int> R) {
n = H.size();
int q = L.size();
ans.resize(q, inf);
for (int i = 0; i < n; ++i) arr[i + 1] = pii(H[i], i + 1);
init(1, 1, n);
for (int i = 0; i < q; ++i) {
int mx = getMax(1, 1, n, L[i] + 1, R[i] + 1).second;
qs[mx].emplace_back(i, L[i] + 1, R[i] + 1);
}
getQuery(1, n);
for (int i = 1; i <= n; ++i) qs[i].clear();
for (int i = 0; i < n; ++i) arr[n - i] = pii(H[i], i - n);
init(1, 1, n);
for (int i = 0; i < q; ++i) {
int mx = -getMax(1, 1, n, n - R[i], n - L[i]).second;
qs[mx].emplace_back(i, n - R[i], n - L[i]);
}
getQuery(1, n);
return ans;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
18 ms |
17960 KB |
Output is correct |
2 |
Correct |
23 ms |
18268 KB |
Output is correct |
3 |
Correct |
22 ms |
18288 KB |
Output is correct |
4 |
Correct |
22 ms |
18268 KB |
Output is correct |
5 |
Correct |
22 ms |
18268 KB |
Output is correct |
6 |
Correct |
22 ms |
18396 KB |
Output is correct |
7 |
Correct |
24 ms |
18272 KB |
Output is correct |
8 |
Correct |
22 ms |
18396 KB |
Output is correct |
9 |
Correct |
22 ms |
18296 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
18 ms |
17960 KB |
Output is correct |
2 |
Correct |
23 ms |
18268 KB |
Output is correct |
3 |
Correct |
22 ms |
18288 KB |
Output is correct |
4 |
Correct |
22 ms |
18268 KB |
Output is correct |
5 |
Correct |
22 ms |
18268 KB |
Output is correct |
6 |
Correct |
22 ms |
18396 KB |
Output is correct |
7 |
Correct |
24 ms |
18272 KB |
Output is correct |
8 |
Correct |
22 ms |
18396 KB |
Output is correct |
9 |
Correct |
22 ms |
18296 KB |
Output is correct |
10 |
Correct |
32 ms |
18904 KB |
Output is correct |
11 |
Correct |
31 ms |
18908 KB |
Output is correct |
12 |
Correct |
32 ms |
18908 KB |
Output is correct |
13 |
Correct |
31 ms |
18936 KB |
Output is correct |
14 |
Correct |
39 ms |
19164 KB |
Output is correct |
15 |
Correct |
38 ms |
18908 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
18 ms |
17992 KB |
Output is correct |
2 |
Correct |
101 ms |
22180 KB |
Output is correct |
3 |
Correct |
446 ms |
38324 KB |
Output is correct |
4 |
Correct |
403 ms |
34160 KB |
Output is correct |
5 |
Correct |
391 ms |
37944 KB |
Output is correct |
6 |
Correct |
457 ms |
38956 KB |
Output is correct |
7 |
Correct |
467 ms |
40192 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
18 ms |
17992 KB |
Output is correct |
2 |
Correct |
101 ms |
22180 KB |
Output is correct |
3 |
Correct |
446 ms |
38324 KB |
Output is correct |
4 |
Correct |
403 ms |
34160 KB |
Output is correct |
5 |
Correct |
391 ms |
37944 KB |
Output is correct |
6 |
Correct |
457 ms |
38956 KB |
Output is correct |
7 |
Correct |
467 ms |
40192 KB |
Output is correct |
8 |
Correct |
400 ms |
34784 KB |
Output is correct |
9 |
Correct |
327 ms |
34380 KB |
Output is correct |
10 |
Correct |
417 ms |
34768 KB |
Output is correct |
11 |
Correct |
393 ms |
34080 KB |
Output is correct |
12 |
Correct |
327 ms |
33816 KB |
Output is correct |
13 |
Correct |
385 ms |
34664 KB |
Output is correct |
14 |
Correct |
443 ms |
38732 KB |
Output is correct |
15 |
Correct |
381 ms |
34004 KB |
Output is correct |
16 |
Correct |
479 ms |
38484 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
18 ms |
17960 KB |
Output is correct |
2 |
Correct |
23 ms |
18268 KB |
Output is correct |
3 |
Correct |
22 ms |
18288 KB |
Output is correct |
4 |
Correct |
22 ms |
18268 KB |
Output is correct |
5 |
Correct |
22 ms |
18268 KB |
Output is correct |
6 |
Correct |
22 ms |
18396 KB |
Output is correct |
7 |
Correct |
24 ms |
18272 KB |
Output is correct |
8 |
Correct |
22 ms |
18396 KB |
Output is correct |
9 |
Correct |
22 ms |
18296 KB |
Output is correct |
10 |
Correct |
32 ms |
18904 KB |
Output is correct |
11 |
Correct |
31 ms |
18908 KB |
Output is correct |
12 |
Correct |
32 ms |
18908 KB |
Output is correct |
13 |
Correct |
31 ms |
18936 KB |
Output is correct |
14 |
Correct |
39 ms |
19164 KB |
Output is correct |
15 |
Correct |
38 ms |
18908 KB |
Output is correct |
16 |
Correct |
18 ms |
17992 KB |
Output is correct |
17 |
Correct |
101 ms |
22180 KB |
Output is correct |
18 |
Correct |
446 ms |
38324 KB |
Output is correct |
19 |
Correct |
403 ms |
34160 KB |
Output is correct |
20 |
Correct |
391 ms |
37944 KB |
Output is correct |
21 |
Correct |
457 ms |
38956 KB |
Output is correct |
22 |
Correct |
467 ms |
40192 KB |
Output is correct |
23 |
Correct |
400 ms |
34784 KB |
Output is correct |
24 |
Correct |
327 ms |
34380 KB |
Output is correct |
25 |
Correct |
417 ms |
34768 KB |
Output is correct |
26 |
Correct |
393 ms |
34080 KB |
Output is correct |
27 |
Correct |
327 ms |
33816 KB |
Output is correct |
28 |
Correct |
385 ms |
34664 KB |
Output is correct |
29 |
Correct |
443 ms |
38732 KB |
Output is correct |
30 |
Correct |
381 ms |
34004 KB |
Output is correct |
31 |
Correct |
479 ms |
38484 KB |
Output is correct |
32 |
Correct |
3550 ms |
143984 KB |
Output is correct |
33 |
Correct |
2767 ms |
140180 KB |
Output is correct |
34 |
Correct |
3365 ms |
148560 KB |
Output is correct |
35 |
Correct |
3702 ms |
146120 KB |
Output is correct |
36 |
Correct |
2755 ms |
147064 KB |
Output is correct |
37 |
Correct |
3411 ms |
149040 KB |
Output is correct |
38 |
Correct |
4268 ms |
181160 KB |
Output is correct |
39 |
Correct |
4264 ms |
181168 KB |
Output is correct |
40 |
Correct |
3997 ms |
153336 KB |
Output is correct |
41 |
Correct |
4833 ms |
204364 KB |
Output is correct |
42 |
Correct |
5344 ms |
203400 KB |
Output is correct |
43 |
Correct |
5392 ms |
203380 KB |
Output is correct |
44 |
Correct |
4757 ms |
180808 KB |
Output is correct |