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