玛雅看到这题我就醉了,什么玩意……5%的误差?果断膜拜@ydc神犇的题解:
就是因为不清楚如何应用那个答案误差不超过5%啦。
从没见过这么诡异的题一下就懵了,问到了方法之后都还半信半疑,直到后来发现真的很有效果。
就是小于2000的,我们n^2爆搞一下,大于两千的,由于α很小,i又大于2000,所以i-i×α挺大的,准确的说1/(i-1)与1/(i-i×α)差不多大……
那么对于大于2000的i,假如他能弄到k,我们只要把公式中的i-j都变成i-k/2就可以了,误差不会很大。
另外就是不能直接写(int)(a*i),因为当α=0.350000,i=20时给我算出来了个6……所以判一下
1 /************************************************************** 2 Problem: 1011 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:1652 ms 7 Memory:3616 kb 8 ****************************************************************/ 9 10 //BZOJ 1011 11 #include<cmath> 12 #include<vector> 13 #include<cstdio> 14 #include<cstring> 15 #include<cstdlib> 16 #include<iostream> 17 #include<algorithm> 18 #define rep(i,n) for(int i=0;i<n;++i) 19 #define F(i,j,n) for(int i=j;i<=n;++i) 20 #define D(i,j,n) for(int i=j;i>=n;--i) 21 #define pb push_back 22 using namespace std; 23 inline int getint(){ 24 int v=0,sign=1; char ch=getchar(); 25 while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();} 26 while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();} 27 return v*sign; 28 } 29 const int N=1e5+10,INF=~0u>>2; 30 const double eps=1e-7; 31 typedef long long LL; 32 /******************tamplate*********************/ 33 int n; 34 LL m[N],sum[N]; 35 double f[N],a; 36 int main(){ 37 #ifndef ONLINE_JUDGE 38 freopen("1011.in","r",stdin); 39 freopen("1011.out","w",stdout); 40 #endif 41 scanf("%d%lf",&n,&a); 42 F(i,1,n){ 43 scanf("%lld",&m[i]); 44 sum[i]=sum[i-1]+m[i]; 45 } 46 D(i,min(n,2000),1){ 47 int k=(int)(a*i); 48 if (fabs( (double)(k+1)/a-i)<eps) k++; 49 F(j,1,k) f[i]=f[i]+m[i]*m[j]/(double)(i-j); 50 } 51 F(i,2001,n){ 52 int k=(int)(a*i),mid=(1+k)>>1; 53 f[i]=sum[k]*m[i]/(double)(i-mid); 54 } 55 F(i,1,n) printf("%lf\n",f[i]); 56 return 0; 57 }