由eps引发的血案。

Description

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

Input

  第一行两个整数N和A,接下来N行输入N个行星的质量Mi。

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

  1<=N<=10^5,0.01< a < =0.35,0<=Mi<=10^7。

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

Solution

  奇奇怪怪的乱搞/脑洞题。

  题目要我们对于每个i求

  网络上有很多关于“A很小,则i*A也很小”而把j变量直接变成0.5*i的题解。

  小C觉得不是很靠谱,所以小C在这里说一说自己的题解。

  关键点在于“误差不超过5%”。

  我们只要让每个的误差不超过5%即可。

  我们发现,让我们程序复杂度变为O(An^2)的罪魁祸首,就是不断变化的i-j。

  不妨设,所以我们需要找到一种方法来转化t[j],

  使得从求解ans[i]到求解ans[i+1]时,t[j]不会有太多变化,而且误差不能超过5%。

  我们不妨看看t[j]最多转化到什么程度,使得原式的误差不会超过5%:

      

    

    

  也就是说,当时,的误差不会超过5%。

  我们注意到对于所有的i,t[j]是连续的正整数。

  那么问题就很明确了,我们可以构造一个数列a[i],满足a[1]=1,且a[i+1]是最小的正整数满足a[i+1]*0.95≥a[i]。

  对于, 我们只需令,就可以将每个的误差控制在5%以内。

  然后我们就会发现t[j]顿时变得美观了,不妨设为t'[j],它的定义域被分成连续的若干段。

  每一段的函数值都一个固定的数,而且函数值在定义域上递减。(不是严格递减,小C口胡一下希望大家能懂)

  当i变为i-1时,所有t[j]只会减小1。而t'[j]的所有函数段最多只会向左平移一个单位!

    

  所以我们每次改变i,只要维护t'[j]函数值每段的起止端点顺便更新答案即可。

  时间复杂度是O(n*段数)。

  那么问题来了,段数究竟是多少呢?其实就是段!

  如果你担心精度不够,还可以把误差控制在1%以内,也就是α取0.99。

  这样你可能会问,,这时间复杂度有点虚吧?

  然而别忘了a[i]数列中都是整数,a[i]越小,a[i]/0.99-a[i]就会越小,以至于小于1甚至更小。

  那么就会出现a[i]~a[i+1]包含了好几段的情况。实际上α=0.99时,段数只有700多段。

  同理当α=0.95时,段数也不会达到上界,实际只有170多段。

  注意运算中的精度误差。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define MS 1005
#define MN 100005
#define eps 1e-8
using namespace std;
int n,tp,lt;
int pin[MS];
double lim[MS],a[MN],an[MN],ans,m; inline int read()
{
int n=,f=; char c=getchar();
while (c<'' || c>'') {if(c=='-')f=-; c=getchar();}
while (c>='' && c<='') {n=n*+c-''; c=getchar();}
return n*f;
} int main()
{
register int i,j;
n=read(); scanf("%lf",&m);
for (lim[]=-,lim[tp=]=;lim[tp]<n;++tp) lim[tp+]=ceil(lim[tp]/0.95);
for (i=;i<=n;++i) a[i]=read();
for (i=,j=tp;i<=n;++i)
{
while (n-i<=lim[j-]) --j;
pin[j]=max(pin[j],i);
if (i<=m*n+eps) ans+=a[i]/lim[j],lt=max(lt,i);
}
for (i=n;i;--i)
{
for (;lt>m*i+eps;--lt)
for (j=;j<=tp;++j)
if (pin[j]<lt) {ans-=a[lt]/lim[j-]; break;}
for (j=;j<=tp;++j)
{
if (!pin[j]) break;
for (;i-pin[j]<=lim[j-];--pin[j])
if (pin[j]<=lt) ans-=a[pin[j]]/lim[j],ans+=a[pin[j]]/lim[j-];
}
if (ans>=eps) an[i]=ans*a[i]; else an[i]=;
}
for (i=;i<=n;++i) printf("%.7lf\n",an[i]);
}

Last Word

  因为没有在判断j<=i*m时加上eps导致狂WA不止……

  然后疯狂调参,调α的值发现毫无成效。(小C的算法这么靠谱怎么可能错嘛!)

  最后居然还厚颜无耻地向管理员要数据……

  等待管理员回复的当儿,我拿暴力和网上的标程对拍,发现标程都是WA的。

  而且发现都WA在第20行。(20*0.35=7)

  然后就加了eps……

  然后就过了……

  为此小C还学习了SPJ怎么写。这波不亏。

[BZOJ]1011 遥远的行星(HNOI2008)的更多相关文章

  1. BZOJ 1011 遥远的行星

    Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故 ...

  2. BZOJ 1011--[HNOI2008]遥远的行星(乱搞)

    1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 5684  Solved ...

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

    神奇的思路题QAQ 玛雅看到这题我就醉了,什么玩意……5%的误差?果断膜拜@ydc神犇的题解: 就是因为不清楚如何应用那个答案误差不超过5%啦. 从没见过这么诡异的题一下就懵了,问到了方法之后都还半信 ...

  4. BZOJ 1011 [HNOI2008]遥远的行星

    1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2559  Solved ...

  5. BZOJ 1011 [HNOI2008]遥远的行星 (误差分析)

    1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 4974  Solved ...

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

    题目链接: BZOJ - 1011 题目分析 这道题的特别之处在于,答案可以有5%的误差. 嗯..So? 我还是不会,于是看题解. 神犇的题解就是利用这误差范围求一个近似解. 怎么求近似解呢?假如 g ...

  7. 【BZOJ】1011: [HNOI2008]遥远的行星(近似)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1011 题意:$f[i] = \sum_{j=1}^{i-1} \frac{M[i]M[j]}{i-j ...

  8. 1011: [HNOI2008]遥远的行星

    1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2241  Solved ...

  9. 【BZOJ1011】【HNOI2008】遥远的行星(乱搞)

    1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1444  Solved ...

随机推荐

  1. 利用python实现简单邮件功能

    #!/usr/bin/env python # -*- coding:utf-8 -*- import smtplib from email.utils import formataddr from ...

  2. XML使用练习

    #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from xml.etree import ElementTree as ET ...

  3. 【nodejs】安装browser-sync 遇到错误提示

    首先我用的是mac电脑在我执行安装browser-sync时遇到如下问题: 因为不被允许所以我只能不安装全局了: 但是又出现了如下的新问题 纠结了半个小时,终于知道为什么会出现这个问题了, node只 ...

  4. 使用 VSCode 编写 .NET Core 项目之初体验

    注:本文在根据 微软官方文档指导下,根据自己的学习中整理,并不完全照搬文档,但也大体和文档学习路线相似,主要为记录学习过程. 官方学习地址: https://code.visualstudio.com ...

  5. jquery 表双击某行时,取出某行中各列的数值.

      <script> $(function () { $("tr").dblclick(function () { var txt = $("table tr ...

  6. 使用JDBC中的出现的乱码和查询无结果问题

    使用JDBC中的问题 连接的后出现查询结果是乱码. 1.可能是代码的编码与数据库的编码不同 ​ 有可以将二者都设置为UTF-8 2.如果比较懒得话可以只设代码为UTF-8 mysql 连接url中us ...

  7. VMware虚拟机,从厚置备改成精简置备,并减小硬盘的实际占用空间

    工作中由于前期规划不足,导致磁盘空间分配较大,而且是厚置备.后期不再需要时,无法把用不到的空间释放出来,造成空间浪费.经过摸索和实验验证,总结出来一套方法. 风险提示:这个方法在我的环境中验证通过了, ...

  8. Python Tornado初学笔记之表单与模板(一)

    Tornado中的表单和HTML5中的表单具有相同的用途,同样是用于内容的填写.只是不同的是Tornado中的表单需要传入到后台,然后通过后台进行对模板填充. 模板:是一个允许嵌入Python代码片段 ...

  9. [52ABP实战课程系列]Docker&Ubuntu从入门到实战开课啦~

    任何的课程都逃不开理论的支持 久等了各位,在Asp.NET Core2.0 项目实战入门视频课程结束后,根据发起的投票信息.Docker 排在首位.按照结果,我们开始进行Docker视频课程的录制. ...

  10. 数据结构与算法 —— 链表linked list(03)

    继续关于linked list的算法题: 删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素使得每个元素只留下一个. 案例: 给定 1->1->2,返回 1->2 给定  ...