#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
const long long inf = 1e16;
long long dp[maxn];
int a[maxn];
int n;
struct hull {
vector <long long> M, C;
int pt = 0;
bool bad(int i, int j, int k) {
return (C[k] - C[j]) * (M[i] - M[k]) <= (C[k] - C[i]) * (M[j] - M[k]);
}
void add(long long m, long long c) {
M.push_back(m);
C.push_back(c);
while(M.size() >= 3 && bad(M.size() - 3, M.size() - 2, M.size() - 1)) {
M.erase(M.end() - 2);
C.erase(C.end() - 2);
}
}
long long eval(long long x) {
if(M.size() == 0) return inf;
while(pt + 1 < M.size() &&
M[pt] * x + C[pt] >= M[pt + 1] * x + C[pt + 1]) {
++pt;
}
return M[pt] * x + C[pt];
}
} t[maxn * 4];
void update(int x, int c = 1, int b = 0, int e = n) {
t[c].add(n - x, dp[x]);
if(b == e) {
return ;
}
int m = (b + e) >> 1;
int l = c << 1;
int r = l + 1;
if(x <= m) update(x, l, b, m);
else update(x, r, m + 1, e);
}
long long query(int x, int y, int val, int c = 1, int b = 0, int e = n) {
if(x <= b && e <= y) {
return t[c].eval(val);
}
if(y < b || e < x) return inf;
int m = (b + e) >> 1;
int l = c << 1;
int r = l + 1;
return min(query(x, y, val, l, b, m), query(x, y, val, r, m + 1, e));
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
vector <int> v ({0});
a[0] = INT_MAX;
update(0);
dp[0] = inf;
for(int i = 1; i <= n; i++) {
while(a[v.back()] <= a[i]) {
v.pop_back();
}
dp[i] = min(dp[v.back()], query(v.back(), i - 1, a[i]));
update(i);
v.push_back(i);
}
printf("%lld\n", dp[n]);
return 0;
}
Compilation message
Discharging.cpp: In member function 'long long int hull::eval(long long int)':
Discharging.cpp:25:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(pt + 1 < M.size() &&
~~~~~~~^~~~~~~~~~
Discharging.cpp: In function 'int main()':
Discharging.cpp:54:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &n);
~~~~~^~~~~~~~~~
Discharging.cpp:55:36: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
~~~~~^~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
125 ms |
219512 KB |
Output is correct |
2 |
Correct |
123 ms |
219512 KB |
Output is correct |
3 |
Correct |
126 ms |
219512 KB |
Output is correct |
4 |
Correct |
144 ms |
219512 KB |
Output is correct |
5 |
Correct |
155 ms |
219612 KB |
Output is correct |
6 |
Correct |
165 ms |
219516 KB |
Output is correct |
7 |
Correct |
144 ms |
219512 KB |
Output is correct |
8 |
Correct |
124 ms |
219512 KB |
Output is correct |
9 |
Correct |
144 ms |
219512 KB |
Output is correct |
10 |
Correct |
124 ms |
219768 KB |
Output is correct |
11 |
Correct |
144 ms |
219512 KB |
Output is correct |
12 |
Correct |
144 ms |
219512 KB |
Output is correct |
13 |
Correct |
143 ms |
219512 KB |
Output is correct |
14 |
Correct |
124 ms |
219512 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
149 ms |
219768 KB |
Output is correct |
2 |
Correct |
144 ms |
219772 KB |
Output is correct |
3 |
Correct |
127 ms |
219984 KB |
Output is correct |
4 |
Correct |
124 ms |
219768 KB |
Output is correct |
5 |
Correct |
152 ms |
219768 KB |
Output is correct |
6 |
Correct |
122 ms |
219768 KB |
Output is correct |
7 |
Correct |
126 ms |
219768 KB |
Output is correct |
8 |
Correct |
125 ms |
219900 KB |
Output is correct |
9 |
Correct |
122 ms |
219768 KB |
Output is correct |
10 |
Correct |
122 ms |
219768 KB |
Output is correct |
11 |
Correct |
126 ms |
219768 KB |
Output is correct |
12 |
Correct |
125 ms |
219768 KB |
Output is correct |
13 |
Correct |
124 ms |
219772 KB |
Output is correct |
14 |
Correct |
122 ms |
219768 KB |
Output is correct |
15 |
Correct |
125 ms |
219768 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
149 ms |
219768 KB |
Output is correct |
2 |
Correct |
144 ms |
219772 KB |
Output is correct |
3 |
Correct |
127 ms |
219984 KB |
Output is correct |
4 |
Correct |
124 ms |
219768 KB |
Output is correct |
5 |
Correct |
152 ms |
219768 KB |
Output is correct |
6 |
Correct |
122 ms |
219768 KB |
Output is correct |
7 |
Correct |
126 ms |
219768 KB |
Output is correct |
8 |
Correct |
125 ms |
219900 KB |
Output is correct |
9 |
Correct |
122 ms |
219768 KB |
Output is correct |
10 |
Correct |
122 ms |
219768 KB |
Output is correct |
11 |
Correct |
126 ms |
219768 KB |
Output is correct |
12 |
Correct |
125 ms |
219768 KB |
Output is correct |
13 |
Correct |
124 ms |
219772 KB |
Output is correct |
14 |
Correct |
122 ms |
219768 KB |
Output is correct |
15 |
Correct |
125 ms |
219768 KB |
Output is correct |
16 |
Execution timed out |
1107 ms |
346568 KB |
Time limit exceeded |
17 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1122 ms |
353628 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
125 ms |
219512 KB |
Output is correct |
2 |
Correct |
123 ms |
219512 KB |
Output is correct |
3 |
Correct |
126 ms |
219512 KB |
Output is correct |
4 |
Correct |
144 ms |
219512 KB |
Output is correct |
5 |
Correct |
155 ms |
219612 KB |
Output is correct |
6 |
Correct |
165 ms |
219516 KB |
Output is correct |
7 |
Correct |
144 ms |
219512 KB |
Output is correct |
8 |
Correct |
124 ms |
219512 KB |
Output is correct |
9 |
Correct |
144 ms |
219512 KB |
Output is correct |
10 |
Correct |
124 ms |
219768 KB |
Output is correct |
11 |
Correct |
144 ms |
219512 KB |
Output is correct |
12 |
Correct |
144 ms |
219512 KB |
Output is correct |
13 |
Correct |
143 ms |
219512 KB |
Output is correct |
14 |
Correct |
124 ms |
219512 KB |
Output is correct |
15 |
Correct |
149 ms |
219768 KB |
Output is correct |
16 |
Correct |
144 ms |
219772 KB |
Output is correct |
17 |
Correct |
127 ms |
219984 KB |
Output is correct |
18 |
Correct |
124 ms |
219768 KB |
Output is correct |
19 |
Correct |
152 ms |
219768 KB |
Output is correct |
20 |
Correct |
122 ms |
219768 KB |
Output is correct |
21 |
Correct |
126 ms |
219768 KB |
Output is correct |
22 |
Correct |
125 ms |
219900 KB |
Output is correct |
23 |
Correct |
122 ms |
219768 KB |
Output is correct |
24 |
Correct |
122 ms |
219768 KB |
Output is correct |
25 |
Correct |
126 ms |
219768 KB |
Output is correct |
26 |
Correct |
125 ms |
219768 KB |
Output is correct |
27 |
Correct |
124 ms |
219772 KB |
Output is correct |
28 |
Correct |
122 ms |
219768 KB |
Output is correct |
29 |
Correct |
125 ms |
219768 KB |
Output is correct |
30 |
Correct |
124 ms |
219768 KB |
Output is correct |
31 |
Correct |
127 ms |
219768 KB |
Output is correct |
32 |
Correct |
128 ms |
219768 KB |
Output is correct |
33 |
Correct |
127 ms |
219768 KB |
Output is correct |
34 |
Correct |
127 ms |
219768 KB |
Output is correct |
35 |
Correct |
134 ms |
219768 KB |
Output is correct |
36 |
Correct |
146 ms |
219768 KB |
Output is correct |
37 |
Correct |
125 ms |
219768 KB |
Output is correct |
38 |
Correct |
124 ms |
219768 KB |
Output is correct |
39 |
Correct |
130 ms |
219768 KB |
Output is correct |
40 |
Correct |
124 ms |
219768 KB |
Output is correct |
41 |
Correct |
151 ms |
219684 KB |
Output is correct |
42 |
Correct |
125 ms |
219768 KB |
Output is correct |
43 |
Correct |
131 ms |
219768 KB |
Output is correct |
44 |
Correct |
126 ms |
219768 KB |
Output is correct |
45 |
Correct |
125 ms |
219672 KB |
Output is correct |
46 |
Correct |
129 ms |
219792 KB |
Output is correct |
47 |
Correct |
129 ms |
219768 KB |
Output is correct |
48 |
Correct |
125 ms |
219768 KB |
Output is correct |
49 |
Correct |
150 ms |
219768 KB |
Output is correct |
50 |
Correct |
125 ms |
219768 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
125 ms |
219512 KB |
Output is correct |
2 |
Correct |
123 ms |
219512 KB |
Output is correct |
3 |
Correct |
126 ms |
219512 KB |
Output is correct |
4 |
Correct |
144 ms |
219512 KB |
Output is correct |
5 |
Correct |
155 ms |
219612 KB |
Output is correct |
6 |
Correct |
165 ms |
219516 KB |
Output is correct |
7 |
Correct |
144 ms |
219512 KB |
Output is correct |
8 |
Correct |
124 ms |
219512 KB |
Output is correct |
9 |
Correct |
144 ms |
219512 KB |
Output is correct |
10 |
Correct |
124 ms |
219768 KB |
Output is correct |
11 |
Correct |
144 ms |
219512 KB |
Output is correct |
12 |
Correct |
144 ms |
219512 KB |
Output is correct |
13 |
Correct |
143 ms |
219512 KB |
Output is correct |
14 |
Correct |
124 ms |
219512 KB |
Output is correct |
15 |
Correct |
149 ms |
219768 KB |
Output is correct |
16 |
Correct |
144 ms |
219772 KB |
Output is correct |
17 |
Correct |
127 ms |
219984 KB |
Output is correct |
18 |
Correct |
124 ms |
219768 KB |
Output is correct |
19 |
Correct |
152 ms |
219768 KB |
Output is correct |
20 |
Correct |
122 ms |
219768 KB |
Output is correct |
21 |
Correct |
126 ms |
219768 KB |
Output is correct |
22 |
Correct |
125 ms |
219900 KB |
Output is correct |
23 |
Correct |
122 ms |
219768 KB |
Output is correct |
24 |
Correct |
122 ms |
219768 KB |
Output is correct |
25 |
Correct |
126 ms |
219768 KB |
Output is correct |
26 |
Correct |
125 ms |
219768 KB |
Output is correct |
27 |
Correct |
124 ms |
219772 KB |
Output is correct |
28 |
Correct |
122 ms |
219768 KB |
Output is correct |
29 |
Correct |
125 ms |
219768 KB |
Output is correct |
30 |
Execution timed out |
1107 ms |
346568 KB |
Time limit exceeded |
31 |
Halted |
0 ms |
0 KB |
- |