省选模拟46 题解
A. 俄罗斯方块
一道很神奇的 bitset 题。
考虑维护每个格子最上面属于哪个块,这个东西可以用一个 set 来维护每个连续段,操作方法类似珂朵莉树。
对于每次操作,直接用 set 遍历每个有交的连续段,询问并取 $\max$,以得到当前的高度,然后进行覆盖操作。
所以现在的问题是,有一个块 $b$ ,起点为 $s_b$,一个块 $a$,起点为 $s_a$,问落下后的高度。
容易发现并不关注具体的 $s_a,s_b$ ,只关注 $s_a-s_b$。
然后考虑一个暴力做法,枚举答案,然后类似卷积的再枚举每一层,bitset 判断是否有交。
同时,对已经计算过的三元组 $(id_a,id_b,s_a-s_b)$ 进行记忆化操作。
这样的话总复杂度不超过 $O(\frac{S^2}{64})$ ,其中 $S$ 表示总面积,因为每个点对显然只被计算了一次。
但是有个小问题,当块 $a$ 或块 $b$ 的宽度小于 $64$,导致这个 $64$ 除不掉了,所以暴力计算。
B. 能力强化
与 uoj 喂鸽子很像。
大概的思想是,将全部覆盖通过 $Min-Max$ 容斥转化为覆盖一个。
然后发现每个物品是一样的,所以只考虑覆盖的个数乘上组合数即可。
这样的话可以设 $g_{i,x}$ 表示前 $i$ 个物品,用了 $j$ 步,然后一个都没覆盖成功的方案数。
$g$ 数组的求法先 dp,然后用一个简单的 $EGF$ 就可以了。
有了 $g$ 数组,可以通过枚举第 $i+1$ 个物品用了多少步填满,计算 $i+1$ 个元素中覆盖了一个的期望。
C. 将军棋
毒瘤提答题。