BZOJ 1011: [HNOI2008]遥远的行星( )

因为允许5%的误差..把连续一段的j-i看作一个数..然后记个前缀和就好了... 

-------------------------------------------------------------------------

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
 
using namespace std;
 
typedef long long ll;
 
const int maxn = 100009;
 
ll M[maxn];
int N;
double A;
 
void Solve(int l, int r, int p) {
double ans = 0;
if(r - l <= 200) {
for(; l <= r; l++)
ans += (double) (M[l] - M[l - 1]) / (p - l);
} else {
while(l <= r) {
int _r = min(r, l + 200);
ans += (double) (M[_r] - M[l - 1]) / (p - (l + _r) / 2);
l = _r + 1;
}
}
printf("%.7lf\n", ans * (M[p] - M[p - 1]));
}
 
int main() {
scanf("%d%lf", &N, &A);
M[0] = 0;
for(int i = 1; i <= N; i++) {
scanf("%lld", M + i);
M[i] += M[i - 1];
}
for(int i = 1; i <= N; i++)
Solve(1, floor(A * i), i);
return 0;
}

-------------------------------------------------------------------------

1011: [HNOI2008]遥远的行星

Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge
Submit: 2869  Solved: 1031
[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

 

posted @ 2015-11-30 20:49  JSZX11556  阅读(211)  评论(0编辑  收藏  举报