• 清北集训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;
    }
  • 相关阅读:
    【转】浅析Linux中的零拷贝技术
    我们使用 Kafka 生产者在发消息的时候我们关注什么(Python 客户端 1.01 broker)
    【转】Python 访问 HDFS
    HIVE 乱码以及 HUE SQL 语句兼容性的记录(遇到应该会一直更新)
    Kafka 深入核心参数配置
    【转】Hive 修改 table、column
    Redash(开源轻量级商业智能) 生产环境部署及实践 (without docker)
    【转】Linux开机启动管理---systemd使用
    Pyspark 最近使用的一些有趣姿势的梳理
    使用jquery操作select(获取选中option的值等)
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/8641584.html
Copyright © 2020-2023  润新知