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循环没错,可能会错的我都没错,最后发现不知道什么时候复制粘贴的最不可能错的  一句挂了,提醒广大观众朋友:

  打代码千万不要过于依赖复制粘贴

  

原文地址:https://www.cnblogs.com/heoitys/p/11755440.html