杂题乱做4

Posted infinities

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杂题乱做4相关的知识,希望对你有一定的参考价值。

P8499

首先,显然需要树哈希。哈希方法见 OIwiki。

\\(f_i\\) 表示 \\(i\\) 子树的哈希值,那么我们如何判断 \\(G\\) 能否通过删去不超过 \\(k\\) 个点变成 \\(H\\)

考虑 \\(solve(i,j,delta)\\) 表示我们需要判断 \\(G\\)\\(i\\) 子树是否能通过删去不超过 \\(delta\\) 个点变成 \\(H\\)\\(j\\) 子树。

那么我们执行 \\(solve(i,j,delta)\\) 时,考虑枚举 \\(i,j\\) 的每一个儿子,并将这些儿子中子树形态相同的能匹配就匹配上,然后扔掉(可以通过预处理,对儿子的子树哈希值排序,然后直接双指针)。

可以发现这样贪心扔掉尽可能多的对一定会是最优解之一。证明显然。

然后考虑剩下的不同对。

直接对 \\(i\\) 的未匹配儿子枚举全排列,挨个判断一下按这个排列能否匹配 \\(j\\) 的未匹配儿子即可。

加一些剪枝优化即可通过。

具体地,当 \\(i\\) 的儿子个数小于 \\(j\\) 的儿子个数,枚举全排列时如果任意一对匹配满足 \\(size_a_i < size_b_j\\) 就直接不考虑这个序列,计算 \\(\\sum size_a_i-size_b_j\\) 如果中途大于 \\(delta\\) 了就直接不合法。

复杂度比较玄学,但是容易发现这个算法的复杂度接近 \\(O(n\\times k!)\\)

P8290

考虑枚举最小值 \\(x\\),设 \\(f_u,x,0/1\\) 表示当前考虑 \\(u\\) 到某个子树内的一条链,最小值钦定是 \\(x\\),是否已经有最小值出现的方案数,再设 \\(g_u,x,0/1\\) 表示和,那么转移是容易的。

然后对于枚举一棵新子树的时候,我们在转移的同时也要考虑合并 \\(u\\) 到前面子树和 \\(u\\) 到这棵子树的链的并。这个也是简单的。

发现直接这样算,复杂度 \\(O(nV)\\)

但是可以发现,如果 \\(x\\) 不是 \\(l_i,r_i,l_i-k,r_i-k\\) 类似的这些值,那么 \\(x\\) 在变化的过程中,答案值实际上是一个多项式。

于是对于这 \\(O(n)\\) 段选 \\(n\\) 个数出来 \\(dp\\) 然后直接插值即可。

以上是关于杂题乱做4的主要内容,如果未能解决你的问题,请参考以下文章

Java面试题乱笔

2023年4月杂题

CF/AT 乱做

Atcoder 乱做

codeforces 乱做题记录

[题解]noip杂题题解