清北集训Day1T3 LYK loves jumping(期望DP)

题目描述

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+10;
const double INF=1e16;
#define lb(x) (x&(-x))
inline int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';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=0;
        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=1;i<=N;i++) a[i].h=read();
    for(int i=1;i<=N;i++) a[i].t=read(),a[i].ID=i;
    sort(a+1,a+N+1);
    for(int i=1;i<=N;i++)
    {
        now.h=a[i].h-a[i].t;
        if(a[i].t)
        {
            int posmax=upper_bound(a+1,a+N+1,now)-a-1;
            if(posmax) a[i].ans=BIT::Sum(posmax)/posmax+1;
            else a[i].ans=1;
        }
        else
        {
            int posmin=lower_bound(a+1,a+N+1,now)-a-1;
            int posmax=upper_bound(a+1,a+N+1,now)-a-1;
            a[i].ans=(double)(posmax+BIT::Sum(posmin))/posmin;
        }
        BIT::PointChange(i,a[i].ans);
    }
    sort(a+1,a+N+1,comp);
    for(int i=1;i<=N;i++)
    {
        if(a[i].ans>=-INF&&a[i].ans<=INF)
            printf("%.4lf ",a[i].ans);
        else printf("0.0000 ");    
    }
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Pulsar-V

用不动点法和牛顿迭代法求解函数根-Julia

28020
来自专栏AzMark

贝斯狸的 Python 之旅 -- 深入切片操作及原理

我首先通过 input() 函数,接收了外部输入字符串,然后通过 list 函数的切片,实现了回文数,代码真的好简洁,我自己都佩服我自己,我也不知道小组长会问...

12030
来自专栏小樱的经验随笔

Codeforces 626E Simple Skewness(暴力枚举+二分)

E. Simple Skewness time limit per test:3 seconds memory limit per test:256 megab...

31740
来自专栏数据结构与算法

P2658 汽车拉力比赛

题目描述 博艾市将要举行一场汽车拉力比赛。 赛场凹凸不平,所以被描述为M*N的网格来表示海拔高度(1≤ M,N ≤500),每个单元格的海拔范围在0到10^9之...

28580
来自专栏PPV课数据科学社区

数据挖掘知识脉络与资源整理(十)–箱线图

? ? 箱线图的简介 箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常...

34880
来自专栏郭耀华‘s Blog

剑指offer第七天

30.连续子数组的最大和 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最...

26990
来自专栏tkokof 的技术,小趣及杂念

Sweet Snippet系列 之 随机选择

  平日工作学习时总会遇到一些令人欣喜的代码段子(Snippet),虽然都很短小,但是其间所含的道理都颇有意味,遂而觉得应该不时的将她们记下,一来算作复习整理,...

12420
来自专栏数说工作室

【SAS Says】高级篇:IML(1)

开篇话: 前段时间数说君征原创稿,果真得到了不少牛人的赐稿,比如本文的作者Ansta,作为数说工作室的特约撰稿人,将会承担下“【SAS Says】高级篇” 的写...

34640
来自专栏章鱼的慢慢技术路

笔试常考题型之时间复杂度

54860
来自专栏章鱼的慢慢技术路

笔试常考题型之时间复杂度

16930

扫码关注云+社区

领取腾讯云代金券