【题解】UOJ Round #20
// created on 22.09.23
A. 跳蚤电话
倒着删从叶子合并。具体来说令 \(f_i\) 表示 \(i\) 子树删完的方案数。那么 \(f_{u}\) 考虑 \(v\in son_u\) 的转移,枚举子树内最后一个删的点来组哪个子树即可。
提交记录:Submission #584811 - Universal Online Judge (uoj.ac)。
B. 机器蚤分组
首先肯定是 Dilworth 定理,求最长反链。
我们发现对于询问串,答案肯定不超过串长 —— 每个左端点只能最多选一次。同时,最终我们肯定是选择了若干个左右端点单调的区间。这些区间的长度必然相等 —— 每次可以将最长的区间去掉最右侧节点,答案不变。在长度相等的情况下,如果存在 \(x\leq y\) 一定有 \(x=y\) 。
于是问题变成:多次询问给定 \(l,r\),求 \(k\) 满足 \(S[l,l+k-1],\cdots,S[r-k+1,r]\) 中不同串的个数尽可能大。但是此时问题还是两维的,考虑继续转化:如果最后答案是 \(k\),且 \(k\) 个长度为 \(n-k+1\) 的串中有串相等,那么假设当前长度是 \(i<n-k+1\),答案就最多为 \(n-i+1-(n-k+1-i+1)=k-1\) 。因此当答案是 \(k\) 的时候,\(n-k+1\) 中的串必然没有相等。
怎么想到这一步转化的?原因在于我们发现原结论仍然较复杂,而过程是,我们考虑一种方案,答案为 \(k\),长度是 \(i\),这是一个二元组合,我们考虑将结论减维,可以考虑寻找答案和 \(i\) 的关系。剩下的部分猜一下证一下就出来了。
于是问题变成了找 \(\max \mathrm{LCP}(S_i,S_j)\),等价于 \(\max \mathrm{LCS}(S_i,S_j)\) 。这样只需要在 SAM 上对 Endpos 集合合并,每次合并采用启发式合并,并且考虑相邻两个位置以及新增的 LCS 。这样能找到的贡献对是 \(O(n\log n)\) 个,讨论贡献对对询问左端点的覆盖情况,扫描线即可。
不写代码。
C. 金坷垃
考虑令 \(f_i(x)\) 表示第 \(i\) 小大于 \(x\) 的概率,答案为 \(\int f_i(x)dx\) 。
而对于 \(f_i(x)\) 等价于有最多 \(i-1\) 个数小于 \(x\) 的概率,即 \(f_i(x)=\sum\limits_{j=0}^{i-1}[y^j]\prod\left(P(a_k<x)(y-1)+1\right)\) 。改一下定义变成 \(f_i(x)\) 为第 \(i\) 小大于 \(x\),但是第 \(i-1\) 小不大于 \(x\) 的概率,答案只需要做前缀和。此时 \(f_i(x)=[y^{i-1}]\prod\left(P(a_k<x)(y-1)+1\right)\) 。
考虑到值域分 \(O(n)\) 段,每一段 \(P(a_k<x)\) 是一个关于 \(x\) 的多项式。那么求出二元多项式 \(f(x,y)\) 的系数后,最后带上的就是 \(\int_{L}^{R} x^kdx\) 之类的东西。直接做可以做到 \(O(n^4)\) 。不过因为多项式乘法可以撤销,因此每次暴力乘除修正多项式可以做到 \(O(n^3)\),得到 69pts 。
提交记录(\(O(n^4)\)):Submission #584844 - Universal Online Judge (uoj.ac)。
我们求出来的东西 \(f_i(x)=[y^{i-1}]\prod\left(P(a_k<x)(y-1)+1\right)\),假设选了 \(t\) 个 \(P(a_k<x)(y-1)\),那么对 \([y^{i-1}]\) 的贡献是 \({t\choose i-1}(-1)^{t-i+1}\) 。这样如果令 \(g_t(x)=[y^t]\prod (P(a_k<x)y+1)\),就可以反演得到 \(f_i(x)\) 。
因此现在只考虑求 \(g_t(x)=[y^t]\prod (P(a_k<x)y+1)=\sum\limits_{|S|=t}\prod\limits_{i\in S}P(a_i<x)\) 。接下来有个 nb 转化!考虑到 \(P(a_k<x)=\frac{x-c_k}{m},P(a_k<x)‘=\frac{1}{m}\),因此 \(g_t(x)\) 其实是 \(\prod P(a_i<x)\) 求高阶导数,再乘 \(m\) 的若干次方!
提交记录(\(O(n^3)\),但是暴力求导):Submission #584857 - Universal Online Judge (uoj.ac)。
用 NTT 进行优化即可。对于高阶导数的部分同样可以将贡献拆开。
提交记录(\(O(n^2\log n)\)):Submission #584932 - Universal Online Judge (uoj.ac)。