【题解】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


「模板」树同构

spdarkle's blog


独钓寒江雪

考虑一个树 dp。

\[f_{u,0}=\prod f_{v,0/1}\\ f_{u,1}=\prod f_{v,0}\\ Ans=f_{1,0/1} \]

难点在于去重。

实际上方案重复,当且仅当子树中出现重构。(因为此时交换两棵同构且方案相同的子树时,方案相同

所以在合并子树的时候,我们自然的把等价类(就是同构的一堆子树),拎出来一起处理。

对于一个等价类,设每一颗子树的方案数为 \(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. 使一条边 失效/恢复;
    2. 使一个点的所有入边 失效/恢复。
  • 查询

    判断每个点是否出度都为 \(1\),且能够走到一个环。


首先既然我们都保证了出度为 \(1\),就一定合法。

这个用随机化 hash 是好 \(O(1)\) 判的,现在问题在于维护 修改 2。

哦!简单,先预处理出删每个点的入边的时候对总的 hash 值的影响,然后直接更新就行了。

posted @ 2024-10-18 08:23  CloudWings  阅读(12)  评论(0编辑  收藏  举报