【BZOJ】【1011】【HNOI2008】遥远的行星

神奇的思路题QAQ



  玛雅看到这题我就醉了,什么玩意……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 }

1011: [HNOI2008]遥远的行星

Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge
Submit: 2302  Solved: 820
[Submit][Status][Discuss]

Description


线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为
Fi->j=Mi*Mj/(j-i)
其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用。请计算每颗行星的受力,只要结果的相对误差不超过5%即可.

Input

第一行两个整数N和A. 1<=N<=10^5.0.01< a < =0.35
接下来N行输入N个行星的质量Mi,保证0<=Mi<=10^7

Output

N行,依次输出各行星的受力情况

Sample Input

5 0.3
3
5
6
2
4

Sample Output

0.000000
0.000000
0.000000
1.968750
2.976000

HINT

精确结果应该为0 0 0 2 3,但样例输出的结果误差不超过5%,也算对

Source

[Submit][Status][Discuss]

时间: 2024-10-12 13:21:58

【BZOJ】【1011】【HNOI2008】遥远的行星的相关文章

BZOJ 1011([HNOI2008]遥远的行星-估计误差)

1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 2134  Solved: 755 [Submit][Status] Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请计算每颗行星的

BZOJ 1011 [HNOI2008]遥远的行星

1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2559  Solved: 923[Submit][Status][Discuss] Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请

bzoj 1011[HNOI2008]遥远的行星 - 近似

1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请计算每颗行星的受力,只要结果的相对误差不超过5%即可. Input 第一行两个整数N和A. 1<

[BZOJ 1011] [HNOI2008] 遥远的行星 【近似解】

题目链接: BZOJ - 1011 题目分析 这道题的特别之处在于,答案可以有5%的误差. 嗯..So? 我还是不会,于是看题解. 神犇的题解就是利用这误差范围求一个近似解. 怎么求近似解呢?假如 g[i] 是第 i 个点受到的引力来源中最后的一个点.那么我们如果要直接求 f[i] (第i个点受到的引力)是要枚举 1 到 g[i] . 然而如果我们直接从之前的一个 f[i - t] 为基础近似一下,再暴力计算 g[i - t] + 1 到 g[i] 的部分,就会大大节省时间了. 因为离得越远的行

1011: [HNOI2008]遥远的行星

1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2241  Solved: 793[Submit][Status] Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请计算每颗行星的受力

【乱搞】【HNOI 2008】【bzoj 1011】遥远的行星

1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 2640 Solved: 954 Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请计算每颗行星的受力,只要结果的相对误差不超过5%即可.

【BZOJ 1011】 [HNOI2008]遥远的行星

1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 2131  Solved: 754 [Submit][Status] Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请计算每颗行星的

[BZOJ1011] [HNOI2008] 遥远的行星

Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请计算每颗行星的受力,只要结果的相对误差不超过5%即可. Input 第一行两个整数N和A. 1<=N<=10^5.0.01< a < =0.35,接下来N行输入N个行星的质量Mi,保证0<=Mi<=10^7 Output N行

[HNOI2008]遥远的行星

https://www.luogu.org/problem/show?pid=3198 小于500的挨着算 大于的分母取平均值 #include<cstdio> using namespace std; double m[100005],sum[100005]; int main() { int n; double a,ans; scanf("%d%lf",&n,&a); for(int j=1;j<=n;j++) { int i=(int)(a*j+

【bzoj1011】[HNOI2008]遥远的行星

#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<queue> using namespace std; typedef long double LD; #define N 100010 long double a; int n,T=50;