RT,李超树求调。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll s = 0, w = 1;char ch = getchar();
while(!isdigit(ch)){if(ch == '-'){w = -1;}ch = getchar();}
while(isdigit(ch)) s = s * 10 + ch - 48, ch = getchar();
return s * w;
}
int T, n;
ll c;
struct L
{
ll k, b;
} a[200005];
int t[4000004];
ll h[200003];
ll f[200003];
int cnt = 0;
inline void add(ll k, ll b)
{
++ cnt;
a[cnt].k = k;
a[cnt].b = b;
}
inline int cmp(ll A, ll B)
{
if(A == B) return 0;
else if(A > B) return 1;
else return -1;
}
inline ll calc(int id, ll x)
{
return a[id].k * x + a[id].b;
}
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
inline void upd(int x, int l, int r, int u)
{
int &v = t[x];
if(l == r)
{
if(cmp(calc(v, r), calc(u, l)) == -1) swap(u, v);
return;
}
int mid = (l + r) >> 1;
int midb = cmp(calc(v, mid), calc(u, mid));
if(midb == 1) swap(u, v);
int lb = cmp(calc(v, l), calc(u, l)), rb = cmp(calc(v, r), calc(u, r));
if(lb == 1) upd(ls(x), l, mid, u);
if(rb == 1) upd(rs(x), mid + 1, r, u);
}
inline ll query(int x, int l, int r, int k)
{
ll res = calc(t[x], k);
if(l == r) return res;
int mid = (l + r) >> 1;
if(k <= mid) res = min(res, query(ls(x), l, mid, k));
if(k > mid) res = min(res, query(rs(x), mid + 1, r, k));
return res;
}
/*
dp[i] = Min dp[j] + (h[i] - h[j]) ^ 2 + C
= Min dp[j] + h[i] ^ 2 + h[j] ^ 2 - 2 * h[i] * h[j] + C
= h[i] ^ 2 + C + Min -2 * h[i] * h[j] + h[j] ^ 2 + dp[j]
*/
inline void solve()
{
n = read(), c = read();
a[0].b = 1e18;
for(int i = 1;i <= n;++ i) h[i] = read();
add(-2 * h[1], h[1] * h[1]);
upd(1, 0, 1000000, cnt);
for(int i = 2;i <= n;++ i)
{
f[i] = h[i] * h[i] + c + query(1, 0, 1000000, h[i]);
add(-2 * h[i], h[i] * h[i] + f[i]);
upd(1, 0, 1000000, cnt);
}
cout << f[n] << '\n';
}
int main()
{
T = 1;
while(T --) solve();
return 0;
}