# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
939063 | vjudge1 | Building Bridges (CEOI17_building) | C++17 | 84 ms | 20180 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
//using namespace __gnu_pbds;
bool YES(bool f){ if(f) cout << "Yes\n" ; else cout << "No\n" ; return f ; }
void YES(){YES(1);}
void NO(){YES(0);}
void fopn(string name){freopen((name+".in").c_str(),"r",stdin); freopen((name+".out").c_str(),"w",stdout);}
//#define ordered_set tree<int, null_type,less_equal<int>, rb_tree_tag,tree_order_statistics_node_update>
#define ios ios_base::sync_with_stdio(0) ; cin.tie(0) ; cout.tie(0);
#define int long long
#define ld long double
#define pii pair <int , int>
#define all(x) x.begin() , x.end()
#define ff first
#define ss second
#define endl '\n'
const int N = 1e6 + 5 ;
const int inf = 1e16 ;
const int mod = 1e9 + 8 ;
const double eps = 1e-8 ;
template <class T>
bool chmax( T& x , const T& y ){
bool f = 0 ;
if ( x < y ) x = y , f = 1 ;
return f ;
}
template <class T>
bool chmin( T &x , const T &y ){
bool f = 0 ;
if ( x > y ) x = y , f = 1 ;
return f ;
}
//code
int n ;
int a[N] , b[N] , pref[N] , dp[N] ;
const int q = -(1LL<<62);
struct line{
int m , c ;
mutable function<const line*()> S ;
bool operator <( const line& x) const{
if ( x.c != q ) return m < x.m ;
const line* s = S() ;
if (!s) return 0 ;
int v = x.m ;
return c - s->c < (s->m-m) * v ;
}
};
struct cht : public multiset<line>{
bool bad ( iterator y ){
auto z = next(y) ;
if ( y == begin() ){
if ( z == end() ) return 0 ;
return y->m == z->m && y->c <= z->c ;
}
auto x = prev(y) ;
if ( z == end() ) return y->m == x->m && y->c <= x->c ;
return (x->c - y->c)*(z->m - y->m) >= ( y->c - z->c ) * ( y->m - x->m ) ;
}
void add ( int m , int b ){
auto y = insert({m,b}) ;
y->S = [=] { return next(y) == end() ? 0 : &*next(y) ; } ;
if ( bad(y) ){ erase(y) ; return ; }
while ( next(y) != end() && bad(next(y)) ) erase(next(y)) ;
while ( y != begin() && bad (prev(y)) ) erase(prev(y)) ;
}
int get ( int x ){
auto ans = *lower_bound((line) { x , q }) ;
return -(ans.m*x + ans.c) ;
}
};
void solve(){
cin >> n ;
for ( int i = 0 ; i < n ; i ++ ) cin >> a[i] ;
for ( int i = 0 ; i < n ; i ++ ) cin >> b[i] ;
pref[0] = a[0] ;
cht C ;
C.add(2*a[0],-(dp[0]+a[0]*a[0]-pref[0])) ;
for ( int i = 1 ; i < n ; i ++ ) pref[i] = pref[i-1] + b[i] ;
for ( int i = 1 ; i < n ; i ++ ){
dp[i] = C.get(a[i]) + a[i]*a[i]+pref[i-1] ;
C.add(2*a[i],-(a[i]*a[i]+dp[i]-pref[i])) ;
}
cout << dp[n-1] ;
}
signed main(){
ios ;
int t = 1 ;
//cin >> t ;
while ( t -- ) solve() ;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |