Loading

【题解】CTT 2019 Day 1

A. 递增树列

\(f_{u,i}\) 表示 \(u\) 的子树,已经用掉 \(i\) 个点,剩下的点排列满足要求的方案数。

考虑方案的计算,用掉的 \(i\) 个点取自子树,要求 \(\sum d_v=i\) 。于是,每个子树剩下 \(s_v-d_v\) 个点。在不断地选树后,一定会剩下某个子树非空(且恰好这个子树非空,当然,这个 "子树" 也有可能是根本身),那么递归进入求解。

于是我们枚举非空子树 \(v\),以及剩下的点树 \(k_v\) 。然后问题变成了,有 \(t+1\) 种颜色,每种颜色有一个出现次数,要求排列使得相邻两项颜色不同(并额外处理最后出现的颜色,是 \(v\) 的情况)。带容斥系数后,相当于要做二维卷积,直接背包即可。

B. 异世界的文章分割者

最开始以为是用后缀自动机加个扫描线求区间答案的,但 \(w^2\) 很难搞。

考虑外层二分,内层要做的无非就是从每次考虑最长的扩展距离。如果硬二分的话,区间长度总和不可接受。考虑先从小到大枚举 \(2^k\) 直到发现第一个非法 \(2^k\),然后中间这段再二分。这样区间长度总和就变成 \(O(n\log^2 n)\) 了!

求答案很容易用后缀自动机做到线性。

C. 时间旅行

考虑大小为 \(I_1,I_2\) 的环换成 \(I_1+I_2-1,1\) 肯定不劣:考虑将 \(I_1\) 中,将中间点删掉(该点同时链接最小点、最大点);得到的路径是 \(I_1\) 中最小值,到最大值的路径。考虑将 \(I_2\),选择一个和中间点相连的边删掉变成路径。注意到路径起终点值域区间,如果有包含 / 相离,那么直接拼肯定没问题。否则情况是简单的,只需要考虑 \(I_1\) 中点的相对位置即可。

于是,最后要找的就是大小为 \(n-k+1\) 的环。二分答案 \(w\) 。我们要找的其实是 \(2k+3\) 状的匹配:即 \(k\) 对成二匹配,一个 \(a-b-c\) 形式的匹配。注意到将权值排序后,区间 \([i,i+\lfloor\frac{n-k+1}{2}\rfloor]\) 中必然存在一个匹配(或者 \(a-b-c\) 中的任意两个,我们认为 \(a<b<c\)),因为匹配距离肯定 \(\geq w\),于是区间 \([i,i+\lfloor\frac{n-k+1}{2}\rfloor]\) 必然合法。因此充分必要性都得证,问题得到转化。

于是,对于 \(b\) 只要拆成 \(b_1,b_2\) 分别匹配 \(a,c\) 即可。在必须退匹配的时候,再删匹配,重新增广。注意剪枝即可。提交记录:Submission #77487 - QOJ.ac

posted @ 2023-02-26 21:37  Qiuly  阅读(213)  评论(0编辑  收藏  举报