BZOJ1011 HNOI2008 遙遠的行星

2022-03-29 17:44:48 字數 1210 閱讀 8389

bzoj1011: [hnoi2008]遙遠的行星

直線上n顆行星,x=i處有行星i,行星j受到行星i的作用力,當且僅當i<=aj.此時j受到作用力的大小為 fi->j=

mi*mj/(j-i) 其中a為很小的常量,故直觀上說每顆行星都只受到距離遙遠的行星的作用。請計算每顆行星的受力

,只要結果的相對誤差不超過5%即可.

第一行兩個整數n和a. 1<=n<=10^5.0.01< a < =0.35,接下來n行輸入n個行星的質量mi,保證0<=mi<=10^7

n行,依次輸出各行星的受力情況

5 0.335

6240.000000

0.000000

0.000000

1.968750

2.976000

精確結果應該為0 0 0 2 3,但樣例輸出的結果誤差不超過5%,也算對

本來是想做幾道$dp$的,沒想到。。。

一開始想$dp$,發現怎麼都想設不出狀態來。

然後真的沒法了,翻題解。。。

然後看見了我自始至終忽略的一句話:

所以這個題只要把暴力加上乙個超級優化就行了。。。

我們發現在這種條件下正確答案的範圍非常寬。

所以可以採用近似的方法,不必每乙個$j-i$都計算,可以用乙個值來代替某乙個範圍內的$j-i$。

具體實現是:對於乙個$j$,有編號為$i∈[1,aj]$的行星給他力。

將此區間分成$k$段,每段的分母$j-i$近似用該區間中點的分母表示。

$k$可以自行選乙個定值,這裡用的是$100$。

可以往小裡取,不$tle$即可。

附**:

#include#include#include#include#define maxn 100010

using namespace std;

int n;

double a,m[maxn],f[maxn],sum[maxn];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}void work()

for(int j=l*100+1;j<=len;j++)f[i]+=m[i]*m[j]/(i-j);

} }for(int i=1;i<=n;i++)printf("%.6lf\n",f[i]);

}void init()

}int main()

bzoj1011 HNOI2008 遙遠的行星

bzoj1011 hnoi2008 遙遠的行星 emmm玄學誤差題 之前有做過一道min hash的trick題,有空整理一下 坑 a的上限0.35 f i sum frac 暴力複雜的 n 0.35n 過不掉對於乙個i來說若可以 o1 求出 sum frac i a 的近似值 就可利用m的字首和o...

BZOJ 1011 HNOI2008 遙遠的行星

time limit 10 sec memory limit 162 mbsec special judge submit 2559 solved 923 submit status discuss 直線上n顆行星,x i處有行星i,行星j受到行星i的作用力,當且僅當i aj.此時j受到作用力的大小...

bzoj1011 HNOI2008 遙遠的行星

直線上n顆行星,x i處有行星i,行星j受到行星i的作用力,當且僅當i aj.此時j受到作用力的大小為 fi j mi mj j i 其中a為很小的常量,故直觀上說每顆行星都只受到距離遙遠的行星的作用。請計算每顆行星的受力 只要結果的相對誤差不超過5 即可.第一行兩個整數n和a.1 n 10 5.0...