因为允许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
", 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 JudgeSubmit: 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
3
5
6
2
4
Sample Output
0.000000
0.000000
0.000000
1.968750
2.976000
0.000000
0.000000
1.968750
2.976000
HINT
精确结果应该为0 0 0 2 3,但样例输出的结果误差不超过5%,也算对