这一份代码WA on 1_03
#include<bits/stdc++.h>
#define int long long
using namespace std;
int N, C;
const int maxn = 200100;
struct node{
int k, b;
}que[maxn];
int l, r;
int h[maxn];
int dp[maxn];
bool calc(int a, int idx) {
if(h[idx] * que[a].k + que[a].b >= h[idx] * que[a+1].k + que[a+1].b) {
return true;
} else {
return false;
}
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> N >> C;
for(int i=1; i<=N; ++i) {
cin >> h[i];
}
l = r = 1;
que[1].k = -2 * h[1];
que[1].b = h[1] * h[1];
for(int i=2; i<=N; ++i) {
while(l < r and calc(l, i)) {
++l;
}
dp[i] = que[l].k * h[i] + que[l].b + h[i]*h[i] + C;
que[++r].k = -2 * h[i];
que[r].b = dp[i] + h[i]*h[i];
}
cout << dp[N];
return 0;
}