这题跟HDU3507差不多。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1000010;
int n;
__int64 c, x[maxn];
__int64 dp[maxn];
int q[maxn], head, tail;
__int64 dy(int j, int i)
{
return dp[i] + x[i+1] * x[i+1] - (dp[j] + x[j+1] * x[j+1]);
}
__int64 dx(int j, int i)
{
return 2 * (x[i+1] - x[j+1]);
}
void DP()
{
dp[0] = 0;
head = tail = 0;
q[tail++] = 0;
for (int i = 1; i <= n; ++i) {
while (tail - head >= 2) {
int k = q[head], j = q[head+1];
if (dy(k, j) < dx(k, j) * x[i]) {
head++;
} else {
break;
}
}
dp[i] = dp[q[head]] + (x[i] - x[q[head]+1]) * (x[i] - x[q[head]+1]) + c;
while (tail - head >= 2) {
int k = q[tail-2], j = q[tail-1];
if (dy(k, j) * dx(j, i) >= dx(k, j) * dy(j, i)) {
tail--;
} else {
break;
}
}
q[tail++] = i;
}
printf("%I64d\n", dp[n]);
}
int main()
{
while (scanf("%d%I64d", &n, &c) != EOF) {
if (n == 0 && c == 0) break;
for (int i = 1; i <= n; ++i) {
scanf("%I64d", &x[i]);
}
for (int i = 2; i <= n; ++i) {
x[i] -= x[1];
}
x[1] = 0;
DP();
}
return 0;
}