Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef signed long long ll;
- const ll MAXN = 2*1e5 + 7;
- const ll MAXC = 1e12 + 7;
- const ll MAXH = 1e6 + 7;
- ll n, c;
- vector<ll> h;
- ll dp[MAXN];
- deque<pair<ll, ll>> q;
- double i(const pair<ll, ll>& a, const pair<ll, ll> b){ /// interesect
- return ((double)(b.second - a.second))/(a.first - b.first);
- }
- double e(const pair<ll, ll>& line, double x){ /// evaluate
- return line.first * x + line.second;
- }
- void add(pair<ll, ll> nw){
- if(q.size() < 2){ q.push_back(nw); return; }
- pair<ll, ll> a = q.back();
- pair<ll, ll> b = *prev(q.end(), 2);
- while(q.size() >= 2 && (i(a, b) > i(b, nw))){
- q.pop_back();
- a = b;
- b = *prev(q.end(), -2);
- }
- q.push_back(nw);
- }
- ll query(double x){
- if(q.size() < 2){ return e(q.front(), x); }
- pair<ll, ll> a = q.front();
- pair<ll, ll> b = *next(q.begin());
- while(q.size() >= 2 && i(a, b) < x){
- q.pop_front();
- a = b;
- b = *next(q.begin());
- }
- return e(q.front(), x);
- }
- int main(){
- cin >> n >> c;
- h.resize(n);
- for(ll i = 0; i < n; i++){
- cin >> h[i];
- }
- for(ll i = 0; i < n; i++){
- /// h[i]*h[i] - 2*h[i]*h[j] + h[j]*h[j] + dp[j] + c;
- if(i == 0){ dp[i] = 0; }
- else{
- dp[i] = query(h[i]) + h[i]*h[i] + c;
- }
- pair<ll, ll> newLine = {-2*h[i], h[i]*h[i] + dp[i]};
- add(newLine);
- }
- cout << dp[n-1] << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement