题目描述
众所周知Kelukin是一名宇宙级土豪,他公司的生意自然是相当的好。
现在他手上有n份工作要完成,每一份工作有一个土豪指标Ak。由于这些工作数量太多,Kelukin又懒,所以他无法一个人完成,他需要雇用很多工人来帮忙。可是Kelukin十分小气,经常克扣工资,因此没有多少人愿意帮他。而愿意帮他的那些工人各个都是奇葩,而且他们非常精明,按工作量收费,小于k份的工作量他们是不会去做的,而他们完成一次工作要额外收C元。一个工人最多做一次工作。
Kelukin表示那些工作之间有很多是类似的,完成了第一份第二份能很快扫完,因此他这么规定一个工人的报酬:若工人所做的工作的土豪指标为(T1,T2,T3,T4……,Tm),则他的报酬为C+(maxTi-minTi)^2,1<=i<=m,m>=k。
作为Kelukin的贴身秘书,你有义务告诉他为了完成这n份工作最少要花多少钱。当然,Kelukin非常的小气,他是不会给你工资的。
输入
第一行三个正整数n、k、C(1≤k≤n≤10^6,0≤C≤10^9),之间用一个空格隔开。
第二行为n个正整数,描述n份工作的土豪指标(0<Ak≤10^9),之间用一个空格隔开。
输出
一行仅一个整数,表示Kelukin最少需要支付的工资(保证答案不大于10^17)。
样例输入
2 1 1
2 4
样例输出
2
提示
【样例说明】
如果分给一个工人做,收费为 1 + (4 – 2) ^2 = 5。
如果分给两个工人作,收费为 1 + 1 = 2。
所以最小收费为2。
【数据范围】
对于50%的测试数据中保证有N≤1000。
对于70%的测试数据中保证有N≤50000。
对于100%的测试数据中保证有N≤1000000。
斜率优化裸题。。。调了半天发现队列指针初值不对。。。
var
f,q:array[0..1000111] of int64;
a:array[0..1000111] of double;
n,k,c,i,st,ed:longint;
flag:boolean;
procedure sort(l,r:longint);
var
i,j:longint;
t,m:double;
begin
i:=l;j:=r;m:=a[(i+j) div 2];
repeat
while a[i]<m do inc(i);
while a[j]>m do dec(j);
if i<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
inc(i);dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end;
function judge1(i,j,k:longint):boolean;
begin
if f[j]+sqr(a[j+1])-f[k]-sqr(a[k+1])<=2*a[i]*(a[j+1]-a[k+1]) then exit(true)
else exit(false);
end;
function judge2(i,j,k:longint):boolean;
var
x1,x2,y1,y2:double;
begin
if (f[i]+sqr(a[i+1])-f[j]-sqr(a[j+1]))*(a[j+1]-a[k+1])<=(a[i+1]-a[j+1])*(f[j]-f[k]+sqr(a[j+1])-sqr(a[k+1]))
then exit(true)
else exit(false);
end;
begin
readln(n,k,c);
for i:=1 to n do
read(a[i]);
for i:=1 to k-1 do
f[i]:=1000000000000000;
sort(1,n);
st:=1;
ed:=1;
for i:=k to n do
begin
while (st<ed)and(judge1(i,q[st+1],q[st])) do inc(st);
f[i]:=f[q[st]]+trunc(sqr(a[i]-a[q[st]+1]))+c;
while (st<ed)and(judge2(i-k+1,q[ed],q[ed-1])) do dec(ed);
ed:=ed+1;
q[ed]:=i-k+1;
end;
write(f[n]);
end.