bzoj 1011 遥远的行星

这不是一篇题解 我纯粹是过来发泄的

这是我做过最烂的一个题 没有之一

为什么可以看我下面的注释

/* 读题读了很久 一直没搞懂啥是Aj
 * 终于读懂 以为是道乱搞就能过去的水题
 * 开始乱搞 换了三种估算方法 在洛谷上都过了
 * bzoj就是wa
 * 每次换了估算方法 拿bzoj数据对比了下输出后面 发现还是比较精确的 基本都差1%以内
 * 然后发现前面当i=20,A=0.35时 我输出和标准输出差很多
 * 然后看了一下发现我t=i*A t=6??
 * 以为De出bug了 然后把t=i*A换成t=(i*A + 0.01)
 * 交到bzoj又wa了……4000多ms之后
 * 最后还是翻了别人的题解 发现这里要跟我下面一样写才行……交上去就A了……
 * De了两小时bug 最后发现是这种坑之后 无语了
 * 更艹蛋的是输出nan就能过????
 * excuse me?写spj能再走心点么??*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 1e5 + 10, F = 500;
const double eps = 1e-7;
double A, m[N], sum[N];
int n;
int main(){
//    freopen("3.in", "r", stdin);
//    freopen("data.out", "w", stdout);
    scanf("%d%lf", &n, &A);
    for(int i = 1; i <= n; i++)
      scanf("%lf", &m[i]), sum[i] = sum[i - 1] + m[i];
    for(int i = 1; i <= n; i++){
        int t = i * A;
        if(fabs((t + 1) / A - i) < eps) t++;//De了两小时的bug的怨念
        double ans = 0;
        if(t <= F){
            for(int j = 1; j <= t; j++) ans += (m[j] * m[i]) / (double)(i - j);
            printf("%lf\n", ans); continue;
        }
        int l = 1, siz = t / F, r; r = l + siz;
        while(r <= t){
            ans += (sum[r] - sum[l - 1]) * m[i] / (double)(i - (l + r) / 2);
            l = r + 1; r = l + siz;
        }
        ans += (sum[t] - sum[l - 1]) * m[i] / (double)(i - (l + t) / 2);
        printf("%lf\n", ans);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Rorshach/p/9388272.html