CSP-S 模拟91
简要写一下
Dove 打扑克
并查集维护堆的合并,最多合并n-1次,且size不同的堆的种类不可能超过$\sqrt(n)$ 种,而且堆的个数越来越小,而且操作次数大概是$3n$
基于以上几点,我们暴力干它关于合并的操作可以暴力,然后用数据结构等优化查询操作$O(\sqrt(n))$或$O(1)$查询
Cicada 与排序
概率DP,设f[x][y],表示初始时在x位置的数当前在y位置的概率,cet[y][k]表示归并排序中从两个儿子合并成一个大区间时位置y上的数移动到位置k 的概率
显然,本轮合并完成后,当前的$f[x][k]=$原来的$f[x][y]*cet[y][k]$,跑一遍归并排序,回溯的时候更新当前的概率,最终得到f[i][j]表示初始i 位置的数排完序后在位置j的概率
概率乘上对应的j后在加和就是位置i最后的期望位置
Cicada 拿衣服
随着区间长度增加,$or$和$max$单调不下降,$and$和$min$单调不上升,$min-max$ 单调下降,而$or-and$ 不确定
所以考虑二进制下,最多有log位,确定右端点后,找左端点,在左端点的选择范围中一定有一段段$or-and$相等的区间,而这样的区间最多约有log 个,在划分的区间内部$or+min-max-and$ 单调,所以可以二分,可以用链表维护分界点,查找左端点时其实不需要一个个区间二分,因为区间内部单调, 所以找区间最值看是否满足大于等于k,
从左向右找第一个存在合法左端点的区间,在这个区间二分即可
打了一下午加半个晚上,没调出来,链表没错,线段树没错,for循环没错,可能会错的我都没错,最后发现不知道什么时候复制粘贴的最不可能错的 一句挂了,提醒广大观众朋友:
打代码千万不要过于依赖复制粘贴