jzoj P1843【汕头市选2014】小球

这里写图片描述

题解:
不难发现,
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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值