$T1:Dove 打扑克$
根据等差数列求和公式,我们发现同时最多有$450$种大小,约为$sqrt n$
那么我们可以用并查集维护块的大小,以及块大小为多少的块有多少个
用STL瞎搞一下就好,$O(qsqrt n logn)$可过
还有一种$O(qsqrt 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}=sumlimits _{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$表优化一下