模拟测试20191028

$T1:Dove 打扑克$

根据等差数列求和公式,我们发现同时最多有$450$种大小,约为$\sqrt n$

那么我们可以用并查集维护块的大小,以及块大小为多少的块有多少个

用STL瞎搞一下就好,$O(q\sqrt n logn)$可过

还有一种$O(q\sqrt n)$的做法

我多一个$log$的原因是每次遍历的是$set$而不是数组

考虑直接用数组维护

数组虽然不支持$O(n)$以下复杂度的删除,但是由于我们数组大小只有$\sqrt n$,暴力删除就好了

 

$T2:Cicada 与排序$

大神题(概率期望都是大神题

显然我们只关心相同数之间的相对位置

考虑对每个数分别$dp$

设$dp_{i,j,k}$第$k$层当前处理的数中第$i$个放到第$j$个位置的概率,$g_{a,b,i,j}$表示左边$a$个数,右边$b$个数时左边第$i$个放到第$j$个的概率

转移显然有$dp_{i,j,k}=\sum\limits _{t=1}^{a+b} dp[i][t][k+1]*g[a][b][t][j]$

求$g$有很显然的$dp$,不再赘述

 

$T3:Cicada 拿衣服$

(暴力都能过的题有什么好讲的)

这题突破口在$or-and$上

考虑对于确定的右端点,往左扫时满足如下性质

$1,or-and$最多有$log$种取值,且每种取值连续

$2,or-and$单调递增

$3,min-max$单调递减

既然这样,我们考虑找出所有段,这样就可以在段上直接二分了

经过观察发现,段的改变只有合并而没有删除

直接用数组/链表维护所有断点就好了

再用$ST$表优化一下

posted @ 2019-10-28 16:52  mikufun♘  阅读(115)  评论(6编辑  收藏  举报