CQOI2011分金币&HAOI2008糖果传递

时间:2023-03-08 21:04:22

双倍经验……

没想到白书上竟然有……我还看过……还忘了……

抄份题解:

A1 + X1 - X2 = G

A2 + X2 - X3 = G

.

.

.

An + Xn - X1 = G

解得

X1 = X1

X2 = A1 - G + X1

X3 = A1 + A2 - G - G + X1

.

.

.

Xn = sigma(1, n)A - n * G + X1

注意到ans = abs (X1 - lamda1) + abs (X2 - lamda2) + ... + abs (Xn - lamdan)

于是sort 取中位数

代码:

 var i,n:longint;
x1,tot,ave,ans:int64;
a,c:array[..] of longint;
procedure sort(h,l:longint);
var i,j,m,temp:longint;
begin
i:=h;j:=l;m:=c[(i+j)>>];
repeat
while (c[i]<m) do inc(i);
while (c[j]>m) do dec(j);
if i<=j then
begin
temp:=c[i];c[i]:=c[j];c[j]:=temp;
inc(i);dec(j);
end;
until i>j ;
if i<l then sort(i,l);
if j>h then sort(h,j);
end;
procedure main;
begin
readln(n);
tot:=;
for i:= to n do
begin
readln(a[i]);inc(tot,a[i]);
end;
ave:=tot div n;
c[]:=;
for i:= to n- do c[i]:=c[i-]+a[i]-ave;
sort(,n-);
ans:=;x1:=c[n>>];
for i:= to n- do inc(ans,abs(x1-c[i]));
writeln(ans);
end;
begin
main;
end.