AGC 做题记录
AGC001-099#
非常好的题目。
题意:需要判定是否存在一棵树,满足点 到其最远点距离为 。
解法:
这个数据范围极具迷惑性,因为这题做法是线性的。最远点首先想到直径,假设直径长度为 ,那么, 到 是直径上点的 的范围。计算每一个值的出现次数,若出现了小于 的必然不合法。中间的两个点的出现次数需要特判,其余点不得少于两个。
https://atcoder.jp/contests/agc005/submissions/59250106
给定一棵 个节点的树,每一个节点有一个权值 或 。问有多少个本质不同的树上集合,满足其是某一个权值为 的点的 邻域。点 的 邻域定义为所有到 的距离不超过 的点的集合。称 为邻域的半径。
部分分:所有集合的权值均为 。
解法:
子树的深度定义为最深点到子树根的路径上的边数。
先考虑部分分怎么做。此时即要求树上有多少个本质不同的邻域。
先考虑邻域为全集的情况。为了不让全集被计算多次,我们限定每一个点的邻域不能为全集,最后答案加上全集。若点 的子树中最深的深度为 ,次深子树的深度为 ,那么显然邻域半径必须小于 。
考虑两个邻域何时会算重:若树上有一条边 ,假设 是根。若 的 邻域覆盖了整个 除 以外的子树,那么这个邻域与 的 邻域是相同的,且 必定是 所在的子树(否则无法覆盖其余子树)。这启示我们,对于每一个邻域,在使其半径最小的中心计算。容易发现,半径最小时,邻域的中心是确定的。
考虑每一个点 为根,考虑其作为邻域的中心时对答案的贡献。其为邻域中心时,其半径不能太大。设其最大半径为 ,则 方向儿子的 邻域不能覆盖 的其它所有儿子。其它儿子中最远的到 点距离是 ,即 ,解得 。 再和 取 ,防止取到全集。 的邻域半径即为 。
当有一些点权值为 的时候,其合法邻域半径的下界不再是 。但是有一些合法邻域仍然以 的中心,仍然在 计算这些合法邻域的贡献。
以 为根,若 为 ,直接套用部分分的做法。否则,有 可能有半径大于等于某个值 的邻域也是合法的。考虑如何求这个 。以 为根时,若某个儿子 的子树中存在 为 的点,则当 时,这个点的 邻域的中心就是 了。所以只要求出 表示 点所有儿子中,有可选点的最深子树的深度最小值。
那么可行半径范围就是 。
换根 DP 即可求出答案。
题意:给定一个仅由 ABC
构成的字符串,每一次操作可以将一段区间中的 ABC
按照某一个排列轮换。有 次询问,每一次问至少多少次操作将这段区间全部变为全部相同。
。
解法:
解法:连续一段相等的称为一段。考虑每一次操作,至多只能减少两个段(不知道证明)。当 时可以找到一种操作方式使得达到这个上界。当 时需要两次操作, 时,若两端相等,只要 1 次,否则要两次操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话