BZOJ1011 HNOI2008 遥远的行星 其他
题意:直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量。请计算每颗行星的受力,只要结果的相对误差不超过5%即可.
题解:出题人脑子有坑系列。完全没见过这么扯的题目,因为${F_j} = \sum\limits_{k = 1}^{\left\lfloor {aj} \right\rfloor } {\frac{{{m_j}{m_k}}}{{j - k}}} $,而且允许很大的误差,则当j>某个值时,取$k - j = j - \frac{{\left\lfloor {aj} \right\rfloor }}{2}$,那么直接用前缀和维护即可。
#include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define eps 1e-8 const int U=2000; const int MAXN=100000+2; int N; double a,m[MAXN],s[MAXN],ans,x,y,z; int main(){ scanf("%d %lf",&N,&a); for(int i=1;i<=N;i++) scanf("%lf",m+i),s[i]=s[i-1]+m[i]; for(int i=1,j;i<=N;i++){ x=i,j=(int)(a*x+eps),y=j,ans=0; if(j<=U) for(int k=j;k;k--) z=k,ans+=m[k]*m[i]/(x-z); else ans=s[j]*m[i]/(x-y/2); printf("%.6lf\n",ans); } return 0; }