【题解】Solution Set - NOIP2024集训Day56 2-sat & 哈希
【题解】Solution Set - NOIP2024集训Day56 2-sat & 哈希
https://www.becoder.com.cn/contest/5640
「CF568C」New Language
做过的 2-sat 。
「JOISC 2020 Day1」汉堡肉
详细题意见 becoder。
「模板」树同构
独钓寒江雪
考虑一个树 dp。
难点在于去重。
实际上方案重复,当且仅当子树中出现重构。(因为此时交换两棵同构且方案相同的子树时,方案相同
所以在合并子树的时候,我们自然的把等价类(就是同构的一堆子树),拎出来一起处理。
对于一个等价类,设每一颗子树的方案数为 \(m\),个数为 \(n\)。
考虑其对 \(f_u\) 的贡献。就是我们给每个子树分配一种方案,不考虑顺序。
所以其对 \(f_u\) 的贡献为 \(\dfrac {m^n}{n!}\)。(FAKE(因为在重复的时候,不止是除以 \(n!\) 那么简单。
现在问题其实等价于,\(m\) 个盒子,\(n\) 个球放入,可以空盒。
所以其对 \(f_u\) 的贡献为 \(\displaystyle{n+m-1\choose m-1}={n+m-1\choose n}\)。
注意要以重心为根做这个 dp。
如果我们让一个点为根节点,其满足存在另一个点为根后与之同构,那么这样的点是不能作为子树被去重到的。
所以我们要选一个点,以其为根,形成的有根树是唯一的,而重心就一定满足这个性质。
(FAKE(因为虚点的两个子树不能同时被选。
如果有两个重心,将她们两个连到一个虚点,然后以之为根正常做就行了。(最后输出的时候相当于钦定虚点不能成为独立集中的点。
正确的做法是:
将她们分开做,然后再合并就行了。(具体怎么合并可以见代码。
「NOI2024」集合
做过。
做法见 提交记录。
「CSP-S2022」星战
简要题意:
给定有向图。
-
修改
- 使一条边 失效/恢复;
- 使一个点的所有入边 失效/恢复。
-
查询
判断每个点是否出度都为 \(1\),且能够走到一个环。
首先既然我们都保证了出度为 \(1\),就一定合法。
这个用随机化 hash 是好 \(O(1)\) 判的,现在问题在于维护 修改 2。
哦!简单,先预处理出删每个点的入边的时候对总的 hash 值的影响,然后直接更新就行了。