Submission #35633

#TimeUsernameProblemLanguageResultExecution timeMemory
35633szawinisBuilding Bridges (CEOI17_building)C++14
100 / 100
189 ms13900 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = (1e9)+7, INF = 1e18;
const int MAX = (1e5)+1;

struct line {
  ll m, c;
  mutable function<const line*()> succ;
  ll getVal(ll x) { return m*x + c; }
  bool operator<(const line& rhs) const {
    if(rhs.c != -INF) return m > rhs.m;
    const line* s = succ();
    if(!s) return false;
    return ((double) c - s->c > (double) (s->m - m)*rhs.m);
  }
};

class MinHull : public multiset<line> {
  bool bad(iterator it) {
    auto nxt = next(it);
    if(it == begin()) {
      if(nxt != end()) return nxt->m == it->m && nxt->c <= it->c;
      else return false;
    }
    auto pre = prev(it);
    if(nxt == end()) return pre->m == it->m && pre->c <= it->c;
    line l1 = *pre, l2 = *it, l3 = *nxt;
    return (double) (l3.c-l1.c)*(l1.m-l2.m) <= (double) (l2.c-l1.c)*(l1.m-l3.m);
  }
public:
  void update(ll m, ll c) {
    auto it = insert({m, c});
    it->succ = [=] { return next(it) != end() ? &*next(it) : 0; };
    if(bad(it)) {
      erase(it);
      return;
    }
    while(it != begin() && bad(prev(it))) erase(prev(it));
    while(next(it) != end() && bad(next(it))) erase(next(it));
  }
  ll query(ll x) {
    line l = *lower_bound({x, -INF});
    return l.getVal(x);
  }
} hull;

int n;
ll h[MAX], w[MAX], dp[MAX];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for(int i = 1; i <= n; i++) cin >> h[i];
  for(int i = 1; i <= n; i++) {
    cin >> w[i];
    w[i] += w[i-1];
  }
  dp[1] = 0;
  hull.update(-2*h[1], dp[1]+h[1]*h[1] - w[1]);
  for(int i = 2; i <= n; i++) {
    dp[i] = hull.query(h[i]) + h[i]*h[i] + w[i-1];
    hull.update(-2*h[i], dp[i] + h[i]*h[i] - w[i]);
  }
  cout << dp[n];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...