Submission #169136

#TimeUsernameProblemLanguageResultExecution timeMemory
169136CaroLindaBuilding Bridges (CEOI17_building)C++14
100 / 100
121 ms66552 KiB
#include <bits/stdc++.h> #define debug printf #define lp(i,a,b) for(int i = a ; i < b ; i++ ) #define ff first #define ss second #define pb push_back #define mk make_pair #define ll long long #define sz size() #define pii pair<int,int> #define all(x) x.begin(),x.end() const int MAXN = 1e5+10 ; const int MAX = 1e6+10, pat = 1e3+10 ; const ll inf = 1e18+5 ; using namespace std ; struct Line { ll a , b ; Line(ll a = 1 , ll b = 0) : a(a) , b(b) {} ll get(ll x ) { if( a > 0 ) return inf ; return a*x + b ; } void print() { printf("%lld %lld\n" ,a , b ) ; } } tree[MAX*4] ; int n ; ll sw[MAXN] , dp[MAXN] , h[MAXN] ; bool vis[MAX*4] ; ll q(ll x) { return x*x ; } int m(int l, int r) { return (l+r)>>1 ; } void upd(int pos, int l, int r, Line v) { if( !vis[pos] ) { vis[pos] = true ; tree[pos] = v ; return ; } if( tree[pos].get(l) <= v.get(l) && tree[pos].get(r) <= v.get(r) ) return ; else if( tree[pos].get(l) > v.get(l) && tree[pos].get(r) > v.get(r) ) return (void)(tree[pos] = v ) ; if( tree[pos].get(l) > v.get(l) ) swap( tree[pos] , v ) ; if( tree[pos].get( m(l,r) ) < v.get( m(l,r) ) ) upd( 2*pos+1, m(l,r)+1, r, v ) ; else { swap( tree[pos] , v ) ; upd( 2*pos , l , m(l,r) , v ) ; } } ll getAns(int pos, int l, int r, ll x) { ll ans = tree[pos].get(x) ; if(l==r) return ans ; if( x <= m(l,r) ) return min(ans, getAns(pos*2,l,m(l,r) , x) ) ; return min( ans , getAns(pos*2+1,m(l,r)+1,r, x) ) ; } void print(int pos, int l, int r) { if( l == r ) { printf("%d %d -> " , l, r) ; tree[pos].print() ; return ; } print(pos*2,l,m(l,r)) ; printf("%d %d -> " , l, r) ; tree[pos].print() ; print(pos*2+1,m(l,r)+1, r) ; } int main() { scanf("%d", &n ) ; lp(i,1,n+1) scanf("%lld",&h[i]) ; lp(i,1,n+1) { scanf("%lld", &sw[i]) ; sw[i] += sw[i-1] ; } upd( 1 , 0 , MAX-5 , Line(h[n]*(-2) , q(h[n]) + sw[n-1] ) ) ; for(int i = n-1 ; i > 0 ; i-- ) { dp[i] = getAns( 1 , 0 , MAX-5 , h[i] ) - sw[i] + q(h[i]) ; upd(1,0,MAX-5 , Line( h[i] * (-2) , q( h[i] ) + sw[i-1] + dp[i] ) ) ; } printf("%lld\n" , dp[1] ) ; }

Compilation message (stderr)

building.cpp: In function 'int main()':
building.cpp:95:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n ) ;
  ~~~~~^~~~~~~~~~~
building.cpp:96:19: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  lp(i,1,n+1) scanf("%lld",&h[i]) ;
              ~~~~~^~~~~~~~~~~~~~
building.cpp:99:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld", &sw[i]) ;
   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...