题目描述

LYK在玩一个魔法游戏,叫做跳跃魔法。 有n个点,每个点有两个属性hi和ti,表示初始高度,和下降高度。也就是说,它初始时高度为hi,一旦LYK踩在这个点上,由于重力的影响,这个点的高度会下降ti,当LYK离开这个点时,这个点的高度又会回到hi。 众所周知的是,跳跃游戏一般是往下跳的,每次LYK可以从一个点跳到任意一个高度不超过它的点,也就是说,当ti=0时,它可以跳到自己本来所在的点。 当没地方可以跳的时候,LYK就会跳到地面,现在LYK想以第i个点为起点,问期望跳多少次能跳到地面。当然i可以是1~n中的任意一个数字。 若期望步数为无穷,输出0.000。 设oo表示无穷大,X为一个数,有oo-X=oo,oo*X=oo,oo/X=oo,oo+X=oo。

输入输出格式

输入格式:

第一行输入一个数n,表示有n个点。 第二行输入n个数,表示hi。 第三行输入n个数,表示ti。

输出格式:

输出一行n个数,表示以当前点为起点时,期望跳几次跳到地面(保留4位小数),若期望次数为无穷,输出“0.0000”。

输入输出样例

输入样例#1: 复制

4
4 2 2 3
0 1 0 0
输出样例#1: 复制

3.8333 1.0000 3.0000 3.5000

说明

对于20%的数据n<=5。 对于另外20%的数据所有hi都相等。 对于再另外20%的数据不存在ti=0。 对于再再另外20%的数据hi都互不相等。 对于100%的数据1<=n,hi<=10^5,0<=ti<=hi。

一道并不难的期望dp

推出样例就相当于做完一半了

对于一个点,分$t=0$和$t!=0$两种情况讨论

然后拿个树状数组维护一下就好了

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=1e6+;
const double INF=1e16;
#define lb(x) (x&(-x))
inline int read()
{
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int N;
struct node
{
int h,t,ID;
double ans;
bool operator < (const node &a) const
{
return a.h==h?t>a.t:h<a.h;
}
}a[MAXN],now;
int comp(const node &a,const node &b)
{
return a.ID<b.ID;
}
namespace BIT
{
double T[MAXN];
void PointChange(int pos,double val)
{
while(pos<=N)
{
T[pos]+=val;
pos+=lb(pos); }
}
double Sum(int pos)
{
double ans=;
while(pos) ans+=T[pos],pos-=lb(pos);
return ans;
}
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#endif
N=read();
for(int i=;i<=N;i++) a[i].h=read();
for(int i=;i<=N;i++) a[i].t=read(),a[i].ID=i;
sort(a+,a+N+);
for(int i=;i<=N;i++)
{
now.h=a[i].h-a[i].t;
if(a[i].t)
{
int posmax=upper_bound(a+,a+N+,now)-a-;
if(posmax) a[i].ans=BIT::Sum(posmax)/posmax+;
else a[i].ans=;
}
else
{
int posmin=lower_bound(a+,a+N+,now)-a-;
int posmax=upper_bound(a+,a+N+,now)-a-;
a[i].ans=(double)(posmax+BIT::Sum(posmin))/posmin;
}
BIT::PointChange(i,a[i].ans);
}
sort(a+,a+N+,comp);
for(int i=;i<=N;i++)
{
if(a[i].ans>=-INF&&a[i].ans<=INF)
printf("%.4lf ",a[i].ans);
else printf("0.0000 ");
}
return ;
}

最新文章

  1. 同一内网不能网段ping 不通
  2. Oracle子查询(嵌套查询)
  3. zw版【转发&#183;台湾nvp系列Delphi例程】HALCON 3D Position Of Circles
  4. C# GET 和 SET作用
  5. LIMITS.H
  6. Bison executable not found in PATH by mysql install
  7. HID class request.
  8. cocos2dx 字体
  9. java_JDBC字段对应
  10. fiddler mock ==&gt; AutoResponder
  11. [原创]消灭eclipse中运行启动的错误:“找不到或无法加载主类”问题
  12. XSD详解三 - 复合元素+总结篇
  13. js给页面添加回车监测事件,实现回车登录功能
  14. C#设计模式(7)——适配器模式
  15. 一个简单的Loading控件
  16. 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165318
  17. 第 8 章 容器网络 - 060 - 在 Docker 中使用 flannel
  18. Berlin 10.1 支持 iPhone 4 (iOS v7.x)
  19. MacBook Pro 15寸常见问题及修复
  20. IntelliJ IDEA 编译程序出现 非法字符 的 解决方法(转)

热门文章

  1. WebService 服务接口
  2. VC++抛出自定义编译期异常的指令
  3. getopt_long 函数
  4. 自动化构建之bower
  5. MongoDB_&quot;Error parsing YAML config file: yaml-cpp: error at line 3, column 9: illegal map value&quot;解决方法
  6. BZOJ 5508: [Tjoi2019]甲苯先生的字符串 矩阵乘法_思维
  7. 商品的CRUD操作
  8. JavaScript 三要素
  9. Orcale-利用闪回恢复数据方法
  10. AMPL下载使用