bzoj1011: [HNOI2008]遥远的行星

传送门

O(n^2)暴力应该会作吧。

但是要TLE(松爷一下也许可以)

但是注意到题目中要求误差<5%

以下是精妙(鬼畜)的乱搞:

令i=a*j向下取整。

Ans=sigma(Ak*Aj/(j-k))(1<=k<=j-1)

因为误差<%5

于是乎我们就可以对式子进行奇妙(古怪)的化简:

Ans≈sigma(Ak*Aj/(j-0.5i))(1<=k<=i)≈sigma(Ak)(1<=k<=i)*Aj/(j-0.5i)

我们用一个前缀和求出sigma(Ak)(1<=k<=i)的值

然后就OK了。

但是这样做可能会卡精度。

于是我们暴力求出比较近的行星受力情况。

这样就可以AC了

/**************************************************************
    Problem: 1011
    User: zhouyuyang
    Language: Pascal
    Result: Accepted
    Time:2208 ms
    Memory:3156 kb
****************************************************************/
 
var
  ans,m,pre:array [0..100005] of extended;
  aa:extended;
  n,i,now,j:longint;
function min(x,y:longint):longint;
  begin if (x<y) then exit(x) else exit(y); end;
begin
  read(n,aa);
  for i:=1 to n do read(m[i]);
  now:=0; ans[1]:=0;
  for i:=2 to min(2000,n) do begin
    if (i*aa+1e-9>=now+1) then inc(now);
    for j:=1 to now do ans[i]:=ans[i]+m[i]*m[j]/(i-j);
  end;
  pre[0]:=0;
  for i:=1 to n do pre[i]:=pre[i-1]+m[i];
  for i:=2001 to n do begin
    if (i*aa+1e-9>=now+1) then inc(now);
    ans[i]:=pre[now]*m[i]/(i-now div 2);
  end;
  for i:=1 to n do writeln(ans[i]:0:6);
end.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值