晚测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]\)的状态,代码的确也不难写。

posted @ 2020-10-27 16:24  An_Fly  阅读(63)  评论(0编辑  收藏  举报