#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 ){
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( hasNext(it) 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( hasPrev(it) ) calcX(it);
if( hasNext(it) ) calcX(next(it));
}
}
ll query( ld x ){
Line l = *prev(cht.upper_bound({1, 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;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Incorrect |
1 ms |
340 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
84 ms |
3808 KB |
Output is correct |
2 |
Correct |
85 ms |
3816 KB |
Output is correct |
3 |
Correct |
78 ms |
3836 KB |
Output is correct |
4 |
Correct |
71 ms |
3592 KB |
Output is correct |
5 |
Correct |
73 ms |
5452 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Incorrect |
1 ms |
340 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |