제출 #939006

#제출 시각아이디문제언어결과실행 시간메모리
939006vjudge1Building Bridges (CEOI17_building)C++17
100 / 100
45 ms9052 KiB
#include <bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() #define ar array #define pb push_back #define ln '\n' #define int long long using i64 = long long; template <class F, class _S> bool chmin(F &u, const _S &v){ bool flag = false; if ( u > v ){ u = v; flag |= true; } return flag; } template <class F, class _S> bool chmax(F &u, const _S &v){ bool flag = false; if ( u < v ){ u = v; flag |= true; } return flag; } const int inf = 1e18; const int C = 2e6; struct Lichao{ struct Line{ int m, c; Line(int m = 0, int c = inf) : m(m), c(c) {} int operator ()(int x){ return m * x + c; } }; struct Info{ Line sg; Info *lf, *rg; Info(Line sg) : sg(sg), lf(0), rg(0) {} }; Info *root = new Info({0, inf}); void ins(Info *v, int l, int r, Line nw){ if ( l == r ){ if ( v->sg(l) > nw(l) ){ v->sg = nw; } return; } int md = (l + r) >> 1; if ( v->sg.m > nw.m ) swap(v->sg, nw); if ( v->sg(md) <= nw(md) ){ if ( v->lf ){ ins(v->lf, l, md, nw); } else v->lf = new Info(nw); } else{ swap(v->sg, nw); if ( v->rg ){ ins(v->rg, md + 1, r, nw); } else v->rg = new Info(nw); } } void ins(Line nw){ ins(root, -C, C, nw); } int get(Info *v, int l, int r, int x){ if ( l == r ){ return v->sg(x); } int md = (l + r) >> 1, ret = v->sg(x); if ( x <= md ){ if ( v->lf ){ chmin(ret, get(v->lf, l, md, x)); } } else{ if ( v->rg ){ chmin(ret, get(v->rg, md + 1, r, x)); } } return ret; } int get(int x){ return get(root, -C, C, x); } void clear(){ root = new Info ({0, inf}); } }; signed main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector <int> h(n), w(n); for ( auto &u: h ) cin >> u; for ( auto &u: w ) cin >> u; vector <int> pf(n); for ( int i = 0; i < n; i++ ){ pf[i] = (i ? pf[i - 1] : 0) + w[i]; } Lichao lch; vector <int> dp(n); auto ins = [&](int j){ lch.ins({-2 * h[j], h[j] * h[j] - pf[j] + dp[j]}); }; ins(0); for ( int i = 1; i < n; i++ ){ dp[i] = lch.get(h[i]) + h[i] * h[i] + pf[i - 1]; ins(i); } cout << dp.back(); cout << '\n'; } /* 6 3 8 7 1 6 6 0 -1 9 1 2 0 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...