1 条题解
-
0
自动搬运
来自洛谷,原作者为

璀璨星空1
倘若我们义无反顾去做不可能之事,世上便再没有不可能。搬运于
2025-08-24 22:36:37,当前版本为作者最后更新于2023-06-20 22:55:27,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
upd:之前加粗的 markdown 挂了。
尘沙里稀疏的草和木凋零朽枯
他在我的耳边计算着明天的路途至今为止我做过最困难的一道思维题。定数 应该没有问题。
第 部分:结论 。
称一个点染 指这个点上有水井,染 指这个点上无水井。称一条长度为 的路径为一个旅行。
我们主要分析一个合法染色方案需要满足的性质。我们将推导出 条结论,随着结论的推导揭示我们的做法。
结论 . 若两个点 满足 ,则 。
先 DFS 两遍求出树的一条直径 。
-
若 ,则不存在任何可能的旅行。此时答案 。先把这种情况判掉。
-
若 ,则树的直径恰有 种染法。对于每个 ,从 到 数第 个点的 必须都相同。记只将第 个等价类染 的染法为第 种染法。
我们将 上的每个点拿出来,以它们为根向远离直径的方向 DFS 这棵树。我们预处理出一些信息。记 为 到 上的投影,记 表示以 为根 的深度,再记 为 子树的高度,即 子树内最深的点 的 。
结论 . 对于任意一个点 ,$\max\limits_{i=1}^n\text{dis}(u,i)=\max\big\{\text{dis}(u,p),\text{dis}(u,q)\big\}$。
结论 . 不需要考虑那些经过直径但两个端点都不在直径上的旅行 。若其他所有旅行都满足要求,则这些旅行一定满足要求。
结论 是此题的关键结论。设 在 的左侧。因为 是直径,一定存在两个直径上的点 分别在 和 的左侧和右侧,使得 $\text{dis}\big(u',\text{project}(u)\big)=\text{dep}(u)$ 且 $\text{dis}\big(v',\text{project}(v)\big)=\text{dep}(v)$。那么 , 以及 都是旅行。如果它们都满足要求,则 $\text{sum}(u,v)=\text{sum}(u',v)+\text{sum}(u,v')-\text{sum}(u',v')=1+1-1=1$,因此 也满足要求。
第 部分:结论 。
但还有一种旅行 是不经过直径的,与直径没有交点。先假设不存在这样的旅行。注:以下 都默认不在直径上。
结论 . 若叶子 满足 且 ,则任何可能的旅程都不包含 。将 删去并将答案 。
结论 . 若结点 满足 或 ,则 处在某个等价类中。称这样的结点 是有归属的,否则是无归属的。
- 若 ,则 。
- 若 ,则 $\text{class}(u)=\big(\text{dis}(p,q)-\text{dis}(u,q)\big)\bmod k$。
结论 . 若结点 满足 且 ,则称 是两侧点,否则称 是一侧点。
- 两侧点 的父亲 一定也是两侧点。因为 都只会减小 ,但是 至少会增加 。
- 因此,所有的一侧点构成若干棵子树。将这些子树的根拿出来,称这些点为关键点。
结论 . 若结点 的子树内存在 使得 且 且 $\text{dep}(v)\leq\left\lfloor\dfrac{k-1}2\right\rfloor$,则 必须染 。
- 因为 满足这 个条件,一定存在两个直径上的点 分别在 的左侧和右侧,使得 。
- 假如 染 的话,直径上 必须全都染 ,这是连续 个全都染 的点,矛盾!
结论 . 若结点 是两侧点,则要么 是有归属的,要么 必须染 。
结论 是此题的关键结论。在某种意义上,结论 都是为结论 服务的。
-
若 $\text{dep}(u)>\left\lfloor\dfrac{k-1}2\right\rfloor$,则 $\text{dis}(u,p)\geq2\Big(\left\lfloor\dfrac{k-1}2\right\rfloor+1\Big)\geq k$, 同理。因此 是有归属的。
-
若 $\text{dep}(u)\leq\left\lfloor\dfrac{k-1}2\right\rfloor$,不妨设 。因为 是两侧点,这意味着 的子树内存在 使得 。考虑最浅的那个 ,有 。由于 ,因此 $\text{dep}(v)\leq\left\lfloor\dfrac{k-1}2\right\rfloor$。
要么 是有归属的,要么 必须染 。因为二者的判别是根据 是否 ,所以这个结论很有用。
第 部分:结论 。
现在考虑一侧点构成的子树的根(即关键点), 要么在直径上要么为两侧点。不妨设 。
结论 . 若结点 被一条长度 的路径 包含,且 上存在一个点 已经确定染 ,则 染 还是 也已经确定。
- 若 ,则 必须染 。否则 必须染 。
因此若 中存在 ,则 子树内的染色方案已经唯一确定。
反之若 全都染 ,则需要给 的子树染一个极小割。即 的子树内染 的结点 一定满足 ,并且子树内所有的叶子 都满足 到 的路径上恰有一个染 的结点。我们记这个为 , 可以通过 DP 直接求出。
再去掉不一定成立的假设,考虑存在不经过直径的旅行 时的情况。
结论 . 若旅行 与直径无交,那么 上的所有点都是两侧点。
- 在同一个 下 $\text{dis}(u,p)=\text{dep}(u)+\text{dis}\big(\text{project}(u),p\big)$,因此 是仅关于 的斜率 的一次函数。我们只需要 DFS 每个两侧点 ,并得到 的所有子树的高度的最大值和次大值即可。
最后,我们来简略的叙述我们的做法。具体实现可以看下方的代码链接,代码和题解叙述的逻辑是完全一致的。
我们维护两个长度为 的序列 和 分别表示第 种染法是否可行以及其合法方案数,初始值为全 。
-
对于每个关键点 , 的子树对 的贡献是一个区间乘的形式。
考虑什么时候 会全都染 。 都要么在直径上要么为两侧点,因此它们都要么是有归属的,要么必须染 。
取出 上所有有归属的点的 值构成的集合 。假设我们采用第 种染法,那么如果 , 就会全都染 。
于是我们要对所有的 将 乘上 。我们将 拆成 和 两个部分。那么每个部分内的 分别构成一段区间。
进一步的观察表明需要区间乘的 个区间的右端点 $r\in\Big\{k-1,\left\lfloor\dfrac{k-1}2\right\rfloor\Big\}$,因此可以直接打后缀乘标记,不需要求乘法逆元。
-
对于每个两侧点 ,考虑 向 方向延伸出的长度为 的链。取出它的集合 ,则在 中出现 次或 次的 将会被 掉。这将会 掉 个区间,直接差分即可。 向 方向延伸出的链同理。
-
对于每个两侧点 ,求出 的所有子树的高度的最大值 和次大值 。若 ,则需要考虑以 为 的与直径无交的旅行。其中限制最严的一个较短子树的高度是 $\min\Big\{s,\left\lfloor\dfrac{k-1}2\right\rfloor\Big\}$,取出它的集合 ,相应 掉 个区间。
最终把还活着的 加起来即可。时间复杂度 ,空间复杂度 。代码链接:https://loj.ac/s/1799853。
-
- 1
信息
- ID
- 7491
- 时间
- 1000~4000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者