zoukankan      html  css  js  c++  java
  • 晚测13

    T1

    考场上想了半天没有思路,貌似可以转化为直线上的点对,但是仍然不可做,原因在于,每次询问的(c)都不一样,不是很好处理,所以好像只能暴力,于是我就打了一个(O(nmlogn))的暴力,接着就发现这样遍历太浪费时间了,有些大小一样的堆完全可以合并在一起,所以就开了一个(set)维护了一下,然后就发现大数据跑的飞快。。。最后就(A)了,仔细想想的确是对的,因为大小不一样的堆最多只有(sqrt n)个。

    T2

    这种题一般的套路是将期望转化为概率,然后做概率(DP),最后统计每种答案的贡献。

    对于这道题来说,我们可以考虑每个位置的贡献,即算出它最后到某个位置的概率,然后概率乘以下标就是答案。

    考虑怎么算这个,出现概率的原因在于归并排序的时候数字有一定概率偏移,所以可以边归并排序边进行(DP)

    定义(f[d][i][j])表示当前处于第(d)层,当前的第(i)个数位于位置(j)的概率是多少,很显然如果归并到最底层(f[d][l][l]=1),那么问题就在于怎么转移。

    如果要把第(i)个数放上去,那么指针显然应该先指到它,而指针指过来也需要概率,所以提前预处理一下。

    定义(g[i][j])表示左边取了(i)个数右边取了(j)个数的概率,那么转移的时候如果左右相等,就乘上(inv_2),否则直接加上。

    这样我们就能够通过枚举指针的位置然后将(f[d+1])的状态转移到(f[d])的状态,代码的确也不难写。

  • 相关阅读:
    单例模式
    建造者模式
    工厂方法模式
    原型模式
    适配器模式
    桥接模式
    装饰模式
    组合模式
    多线程的学习与GDI的学习
    我们复习.Net的这些日子里
  • 原文地址:https://www.cnblogs.com/anyixing-fly/p/13885554.html
Copyright © 2011-2022 走看看