NOIP2022 题解

发布时间 2023-11-15 19:59:07作者: jeefy

去年今时,我得了 100 + 0 + 0 + 8 分,太抽象了 QwQ

所以为什么今天才写这个东西?因为今天才做完了 T2……

[NOIP2022] 种花

简单前缀和优化 DP,不谈。

[NOIP2022] 喵了个喵

非常高级的构造题。

看到 \(k = 2n - 1/2\),我们可能会想到每一个栈内放两个即可,留一个辅助栈,即可完美过掉 \(k = 2n - 2\) 的东西。

考虑我们如何处理多出来的那一个。

我们向后考虑,如果一个元素在栈顶有,那么可以直接消掉,但是不在栈顶存在,那么一定在栈底,所以我们必须保留一个空栈使得可以将栈底的他消掉。

设这个只在栈底的元素为 \(x\),其头上一定有一个元素 \(y\),一个简单的想法是将 \(a_i\) 压在 \(y\) 头上,自然留下了一个空栈。

但是考虑序列为 \(a_i, y, x\) 的情况,此时由于原本的 \(y\)\(a_i\) 压着,所以只能将新的 \(y\) 放入空栈中,但是如此 \(x\) 就没法消掉了,这十分恼人。

但是观察到这种情况出现当且仅当 \(y\)\(a_i - x\) 内的出现次数为奇数,所以我们换一个思路,将 \(a_i\) 放在空栈中,这样到 \(x\) 的时候,\(y\) 也被消完了,此时 \(x\) 所在的栈就变成了空栈。

回来考虑偶数次的情况,我们可以在这里面将 \(y\) 给消完,所以我们将 \(a_i\) 压在 \(y\) 上,每次将 \(y\) 放在 \(a_i\) 上,那么自然到 \(x\) 的时候,\(x\) 的上面就只有 \(y\)\(a_i\),并且原本的空栈还是空着的,所以可以将 \(x\) 消掉,此时 \(y, a_i\) 形成一个新的两个元素的栈。

注意这里新的 \(y\) 只能压在 \(a_i\) 头上,否则可能影响到原本处于栈顶,但是被 \(y\) 压着无法消掉的情况。

按照此规则模拟即可。

[NOIP2022] 建造军营

考虑到每次只会删一条边,那么意味着军营间原图的割边一定需要被看守。

于是边双缩点,一个联通分量内的边可守可不守,变成在树上进行 DP。

计数很烦人,考虑是否能够转化为期望进行计数。

于是我们求在边 \(2^m\) 随机中合法方案数的期望。

考虑 \(f_i\) 表示 \(i\) 所在的强连通分量被选中(但是可能没有军营),初始显然是 \(2^{siz_i}\)

考虑加入一个子树,由于其中的连边有 \(\frac 12\) 的概率断开/连上,所以 \(f_i = \frac 12 f_i + \frac 12 f_i f_y\)

最后我们统计所有的答案,为了不重复,我们只枚举深度最浅的那个点。

由于必须与父亲的边断开,以及非空,所以需要减 \(1\),并且有一个 \(\frac 12\) 的系数:\(\sum \frac 12 (f_i - 1)\)

但是考虑根没有父亲,所以没有 \(\frac 12\) 的系数,特判一下即可。

最后乘上 \(2^m\) 即可。

但愿不会再遇到套路,太抽象了。

[NOIP2022] 比赛

被玩烂的题 QwQ,见 # 算法学习笔记(33): 矩阵乘法与线段树标记