Loading

模拟67—「数据恢复·下落的小球·消失的运算符·古老的序列问题」

数据恢复

用邻项交换法可以得到如果没有 \(f_i\) 的限制,那么按 \(\frac{b}{a}\) 降序排列是最优的。
仍然考虑贪心的从序列中选择 \(\frac{b}{a}\) 的最大的。

如果当前最大的父亲已经被选走,那么肯定直接选它。
否则,选走他的父亲之后直接选他。

对于第二种情况,因为肯定会出现 \(f_i-i\)的组合,所以可以把他们合并成一个点。
合并方法就是 \(a,b\) 分别相加,然后把 \(a_x*b_y\) 先加到答案里,然后亲问题和原问题等价。

合并的过程用并查集维护,贪心的过程用优选队列的话需要标记一下一个点是否被选择过,不过用 set splay 就没这个问题。

下落的小球

大神们考场就切,我研究半天才明白。

首先,当前在考虑一个点的子树,那么这个点的子树中的 \(suma-siz\) 就是把这个子树的球弄完之后还能管多少球。
如果一个点,他的祖先全都被取光了,那么他的各个子树就是独立的。

所以有一种 \(dp\) 做法,直接合并各个子树,因为两部分独立,所以可以分两部分相互合并。
把一个 \(a\) 种方法的排列和一个 \(b\) 种方法的排列合并,方案数是 \(C_{a+b}^{a}\) ,考虑走格子就能理解。

有另外一种做法,因为独立,所以在每个点只把他的子树排列好。
最后把所有点(除叶子,因为无子树)排列子树的方案乘起来就行了。

排列子树还是两种分别弄,剩下的就是可重集合的排列。
比如说我先给 \(ABBAAB\) 算出来排列方案,然而实际上一个 \(B\) 是由 \(CDCCDC\) 排列的。
我在算它的排列,最后把它带入 \(B\) ,就是 \(ACD\) 们的排列方案。

这题主要就是得想到独立的怎么处理,子树部分处理很好想,但是祖先部分处理困扰了我半天。

消失的运算符

古老的序列问题

反思

这场只因为我太菜所以爆炸了。
但是 \(T1\) 的25打挂了, \(T3\) 的前缀和优化没打完, \(T4\) 暴力没打,还是很失误的。
联考题我还是先把暴力满了再说吧。

posted @ 2021-10-04 06:37  Soresen  阅读(139)  评论(0)    收藏  举报