省选模拟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. 将军棋

毒瘤提答题。

posted @ 2020-03-16 21:37  skyh  阅读(110)  评论(0编辑  收藏  举报