bzoj 1011 遥远的行星
Posted rorshach
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ", 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 ", ans); } return 0; }
以上是关于bzoj 1011 遥远的行星的主要内容,如果未能解决你的问题,请参考以下文章