Submission #731073

#TimeUsernameProblemLanguageResultExecution timeMemory
731073Doncho_BonbonchoBuilding Bridges (CEOI17_building)C++14
100 / 100
108 ms12924 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...