#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int MAX_N = 1e6;
const int INF = 1e9;
const int mod = 1e9 + 7;
struct Line{
bool type;
ld x;
ll m, c;
};
typedef const Line& cLine;
typedef const std::set<Line>::iterator& cIter;
std::set<Line> cht;
bool operator <( cLine a, cLine b ){
if( a.type || b.type ) return a.x < b.x;
return a.m > b.m;
}
bool hasPrev( cIter it ){
return it != cht.begin();
}
bool hasNext( cIter it ){
return it != cht.end() and next(it) != cht.end();
}
ld intersection( cIter a, cIter b ){
return (ld)( a -> c - b->c ) / ( b->m - a->m );
}
void calcX( cIter it ){
if( !hasPrev(it) ) return;
Line l = *it;
l.x = intersection( prev(it), it );
cht.insert(cht.erase(it), l);
}
bool bad( cIter it ){
if( hasNext(it) and next(it) -> c <= it -> c ) return true;
return hasPrev(it) and hasNext(it) and intersection( prev(it), next(it) ) <= intersection( prev(it), it );
}
void addLine( ll m, ll c ){
std::set<Line>::iterator it = cht.lower_bound({0, 0, m, c});
if( it != cht.end() and m == it -> m ){
if( it -> c <= c ) return;
cht.erase(it);
}
it = cht.insert({0, 0, m, c}).first;
if( bad( it ) ) cht.erase(it);
else{
while( hasPrev(it) and bad(prev(it)) ) cht.erase(prev(it));
while( hasNext(it) and bad(next(it)) ) cht.erase(next(it));
if( hasNext(it) ) calcX(next(it));
calcX(it);
}
}
ll query( ll x ){
Line l = *prev(cht.upper_bound({1, (ld)x, 0, 0}));
return l.m * x + l.c;
}
ll dp[MAX_N];
ll h[MAX_N];
ll w[MAX_N];
ll sumW = 0;
int main () {
std::ios_base::sync_with_stdio(false); std::cin.tie(NULL);
int n;
std::cin>>n;
for( int i=1 ; i<=n ; i++ ) std::cin>>h[i];
for( int i=1 ; i<=n ; i++ ){ std::cin>>w[i]; sumW += w[i]; }
dp[1] = -w[1];
for( int i=2 ; i<=n ; i++ ){
addLine( -2*h[i-1], dp[i-1] + h[i-1]*h[i-1] );
dp[i] = query( h[i] ) + h[i] * h[i] - w[i];
}
std::cout<<dp[n] + sumW<<"\n";
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
340 KB |
Output is correct |
2 |
Correct |
1 ms |
340 KB |
Output is correct |
3 |
Correct |
1 ms |
340 KB |
Output is correct |
4 |
Correct |
1 ms |
340 KB |
Output is correct |
5 |
Correct |
1 ms |
340 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
68 ms |
2768 KB |
Output is correct |
2 |
Correct |
71 ms |
2776 KB |
Output is correct |
3 |
Correct |
77 ms |
2716 KB |
Output is correct |
4 |
Correct |
69 ms |
2632 KB |
Output is correct |
5 |
Correct |
61 ms |
4432 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
340 KB |
Output is correct |
2 |
Correct |
1 ms |
340 KB |
Output is correct |
3 |
Correct |
1 ms |
340 KB |
Output is correct |
4 |
Correct |
1 ms |
340 KB |
Output is correct |
5 |
Correct |
1 ms |
340 KB |
Output is correct |
6 |
Correct |
68 ms |
2768 KB |
Output is correct |
7 |
Correct |
71 ms |
2776 KB |
Output is correct |
8 |
Correct |
77 ms |
2716 KB |
Output is correct |
9 |
Correct |
69 ms |
2632 KB |
Output is correct |
10 |
Correct |
61 ms |
4432 KB |
Output is correct |
11 |
Correct |
62 ms |
2752 KB |
Output is correct |
12 |
Correct |
76 ms |
3720 KB |
Output is correct |
13 |
Correct |
50 ms |
3796 KB |
Output is correct |
14 |
Correct |
82 ms |
3892 KB |
Output is correct |
15 |
Correct |
108 ms |
12924 KB |
Output is correct |
16 |
Correct |
75 ms |
5416 KB |
Output is correct |
17 |
Correct |
28 ms |
3680 KB |
Output is correct |
18 |
Correct |
28 ms |
3724 KB |
Output is correct |