您的位置:首页 > 其它

jzoj P1843【汕头市选2014】小球

2017-06-05 14:50 288 查看


题解:

不难发现,

ans=∑abs((c[i]-c[j])*(i-j))

1<=i<=n 1<=j<=i

因为c[i]为0或1,所以abs(c[i]-c[j])只可能是0或者1,0对答案没有贡献所以我们不去考虑,这时如果当前c[i]是0时,前面对它有影响的c[j]只能是1,而c[i]=1时,对它有影响的c[j]只能是0,所以我们用2个数分别记录1~i-1的c[i]为0和为1的个数。

然后我们考虑怎么计算i-j,我们可以发现,如果

c[i]=0,设x为1~i-1中c[j]=1的数量,

然后c[i]-c[j]=1就有x个,因为c[i]-c[j]=1,所以我们不用考虑,只需要给答案累加1*(i-j),要计算i-j,因为有x个i-j,i相同,而j各不相同,我们就在c[j]=1时,把j给累加了,最后求x个不同的j的总和sum,然后我们有x个i去减,即x*i-sum。

var
i,n,o:longint;
x,y,x1,y1,ans:int64;
begin
assign(input,'ball.in'); reset(input);
assign(output,'ball.out'); rewrite(output);
readln(n);
for i:=1 to n do
begin
read(o);
if o=0
then begin
ans:=ans+x*i-x1;
inc(y);
y1:=y1+i;
end
else begin
ans:=ans+y*i-y1;
inc(x);
x1:=x1+i;
end;
end;
writeln(ans);
close(input); close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: