F

不妨前考虑 \(70 \%\) 的部分分,\(s\) 全部为 \(1\)。

首先可以发现这个问题之所以困难是因为同一个联通子树可能可以被多个中心节点导出。

因此,我们考虑对于一个合法的联通子树,在 一个 特殊的节点上将其统计,这样可以不重不漏的计算。

为了方便我们令 \(f(x, d)\) 为以 \(x\) 为染色中心距离其不超过 \(d\) 的点构成点集。

考虑什么时候两个点会重复统计,不难得到如下观察:

  • 若 \(f(x, d) \ne \{1, 2, \cdots n\}\) 则对于任意不同的 \(d\) 其 \(f\) 所对点集不同。

证明很显然。

因此,以下我们仅考虑不为全集的联通子树,显然全集是一定合法的。

  • 若 \(f(x, d_1) = f(y, d_2)\) 那么一定有靠 \(x\) 一边的子树全部被染黑或靠 \(y\) 一边的子树全部被染黑。

若两边不存在一个子树全部被染黑,令 \(k = dist(x, y) > 0\) 则有:\(d_1 = d_2 + k, d_2 = d_1 + k\),矛盾。

  • 若 \(f(x, d_1) = f(y, d_2)\) 那么 \(x, y\) 构成的链上一定存在且恰好存在一个点使得其挂在链上的子树内存在点没有被染黑。

反证法,我们可以找到最靠近 \(x\) 子树内没有被全部染黑的点 \(u\) 和最靠近 \(y\) 子树内没有被全部染黑的点 \(v\)。

令 \(k_1 = dist(x, u), k_2 = dist(y, v)\),则 \(u\) 子树内一定恰好是深度不超过 \(d_1 - k_1\) 的节点被染黑,\(v\) 子树内类似为 \(d_2 - k_2\) 的节点被染黑。

同时据此我们也可推出 \(u\) 子树内一定是被不超过 \(d_2 - k_2 - dist(u, v)\) 的节点被染黑,因为 \(u\) 子树内没有被全部染黑,所以深度不超过 \(d_1 - k_1\) 的点构成集合和深度不超过 \(d_2 - k_2 - dist(u, v)(dist(u, v) > 0)\) 构成集合一定不同,矛盾。

唯一性:若不存在则所有点被染黑,与一开始的假设不符。

  • 推论:若 \(x, y\) 在树上相邻,那么一定恰好存在一个点子树内全部被染黑,一个没有全部被染黑。

  • 若 \(f(x, d_1) = f(y, d_2)\),则 \(x, y\) 路径上的每个点 \(u\) 都唯一存在一个 \(d'\) 使得 \(f(x, d_1) = f(u, d') = f(y, d_2)\)

若存在,唯一性由观察一可以保证。

对于存在性,根据观察二,我们不妨令 \(x\) 这边的子树全部被染黑,根据 \(y\) 这边的子树是否被染黑进行讨论。

若 \(y\) 这边的子树没有被全部染黑,则 \(x, y\) 路径上所有点(除了 \(y\))子树内全被染黑,则考虑链上距离 \(x\) 最近的点 \(u\)。

令 \(k = dist(x, y)\),有 \(f(u, d_2 + k - 1)\) 一定覆盖 \(f(y, d_2)\) 中除了 \(x\) 所在的子树内的点。

于此同时,\(f(u, d_2 + k - 1)\) 一定覆盖了 \(x\) 子树内距离其不超过 \(d_2 + k - 2\) 的点。

我们知道 \(f(y, d_2)\) 中仅包含距离 \(x \ \ d_2 - k\) 的点,当 \(k \ge 1\) 时恒有 \(k - 2 \ge -k\)。

若 \(y\) 这边的子树全部被染黑,令 \(u\) 为 \(x, y\) 路径上存在的唯一一个没有被全部染黑的节点。

则有 \(d_1 - dist(x, u) = d_2 - dist(y, u)\),考虑证 \(f(x, d_1) = f(u, d_1 - dist(x, u)) = f(y, d_2)\)。

同时有 \(\forall v \in u \to y, maxdep(v) \le d_1 - dist(x, v) = d_1 - dist(x, u) - dist(u, v)\),因此 \(f(u, d_1 - dist(x, u))\) 能覆盖 \(\forall v \in u \to y\)。

同理可证另一边,此时有 \((x, u), (u, y)\) 为第一种情况,即可证明所有情况。

  • 推论 \(1\):\(\forall S\) 满足 \(S\) 合法,那么合法的染色中心一定构成一颗联通子树。
  • 推论 \(2\):\(\forall S\) 满足 \(S\) 合法,\(S\) 合法的染色中心形成的联通子树 \(T\) 一定满足 \((u, v) \in T\) 且 \(f(u, d) = S\),\(u\) 一侧子树内没有被全部染黑,\(v\) 一侧子树被全部染黑,则一定有 \(f(u, d) = f(v, d + 1)\)(根据观察四的证明易证)。
  • 推论 \(3\):\(\forall S\) 满足 \(S\) 合法,\(S\) 合法的染色中心形成的联通子树 \(T\) 一定满足存在且唯一存在 \(u \in T\) 使得 \(f(u, d) = S\) 且以 \(u\) 为根,\(\forall v \in T, f(u, d) = f(v, d + dist(u, d))\)(根据推论 \(2\) 易证)

因此,我们考虑在 \(S\) 的染色中心形成的联通子树 \(T\) 中 \(u \in T\) 且 \(f(u, d) = S\) 最小的 \(d\) 上统计 \(S\)。

因此,\(u\) 向外扩展半径为 \(d\) 的联通子树能统计当且仅当:

  • \(d < f_u\) 其中 \(f_u\) 为距离 \(u\) 最远点的距离。
  • 根据推论 \(2\),\(u\) 不存在一个子树使得删除这个子树后其他点全被染黑,即 \(d - 2 < g_u\)(\(g_u\) 为 \(u\) 往外和 \(f_u\) 所在点不在同一个子树的最远点 \(v\) 的距离)。

因此我们考虑换根求出 \(f, g\),即可 \(\mathcal{O}(n)\) 计算答案。

考虑回到 \(s\) 中存在 \(0\) 的情况,我们还是考虑将所有合法的联通子树 \(S\) 在将所有点均看作合法情况下应该统计的点统计。

容易发现现在合法的 \(S\) 是部分分的子集,因此只需要将每个点的贡献考虑进关键点的影响即可。

因此 \(\forall u, d \in [0, \min(g_u + 1, f_u - 1)]\) 的每个 \(d\),合法当且仅当 \(f(u, d)\) 的染色中心联通子树内至少存在一个合法点。

若 \(u\) 为关键点,显然所有的 \(d\) 均合法。

否则,考虑将整棵树以 \(u\) 为根,根据推论二当且仅当存在一个子树内的点全部被染黑且存在关键点。

于是我们令 \(h_u = \min\limits_{u \to v,\exists x \in S_v, s_x = 1} q_v\)(其中 \(q_v\) 为以 \(u\) 为根时 \(v\) 子树内的最远点距离),于是相当于对 \(u\) 的贡献限制了下界:\([h_u, \min(g_u + 1, f_u - 1)]\),同样换根 \(\rm dp\) 出 \(h, q\) 后直接计算即可。

复杂度 \(\mathcal{O}(n)\)。


另外提一嘴,这个题存在另外一个思考方向。

我们不考虑选取关键点来统计,考虑将重复计算的联通子树减掉。

根据合法的染色中心构成联通子树这一性质,我们考虑使用 \(\forall\) 联通子树 \(V\) 满足 \(|V| - |E| = 1\) 来容斥。

具体地,我们考虑将所有点不包含全集的贡献先全部加上。

然后枚举每条边 \((u, v)\),考虑计算出 \(u, v\) 构成相同的联通子树剪掉,这里其实就与上面做法的上下界等价。

因此这题存在一个不同的思考方式但导出的结果一模一样。

AGC008 部分简要题解的更多相关文章

  1. Noip 2014酱油记+简要题解

    好吧,day2T1把d默认为1也是醉了,现在只能期待数据弱然后怒卡一等线吧QAQ Day0 第一次下午出发啊真是不错,才2小时左右就到了233,在车上把sao和fate补掉就到了= = 然后到宾馆之后 ...

  2. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  3. Codeforces 863 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...

  4. HNOI2018简要题解

    HNOI2018简要题解 D1T1 寻宝游戏 题意 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为 ...

  5. JXOI2018简要题解

    JXOI2018简要题解 T1 排序问题 题意 九条可怜是一个热爱思考的女孩子. 九条可怜最近正在研究各种排序的性质,她发现了一种很有趣的排序方法: Gobo sort ! Gobo sort 的算法 ...

  6. BJOI2018简要题解

    BJOI2018简要题解 D1T1 二进制 题意 pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 \(3\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...

  7. CQOI2018简要题解

    CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...

  8. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  9. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

随机推荐

  1. 图片 Augmentation整理

    目录 Augmentation Flipping 翻转 Grayscale Equalize 均衡直方图 Posterize 减少颜色通道位数 Cropping Rotation Translatio ...

  2. <学习opencv>图像变换

    拉伸.收缩.扭曲和旋转 统一调整大小 我们经常会遇到一些我们希望转换为其他尺寸的图像. 我们可能想要扩大或缩小图像; 这两项任务都是由同一个功能完成的. cv::resize() 该cv::resiz ...

  3. 编写Java程序,创建一个数学工具类,将该类设计为final类,Final 修饰符的使用。

    返回本章节 返回作业目录 需求说明: 创建一个数学工具类. 将该类设计为final类. 将该类的构造方法的访问权限定义为私有,以防止外界实例化该类. 在该类定义静态double类型常量π,其值为3.1 ...

  4. IntelliJ IDEA 2020.1.1 x64 Debug 断点调试模式详解

    前言 对于初入职场的萌新们来说,很多都还不会 Debug 断点模式.记得我刚写代码的时候,也是通过 System.out.println() 一行一行的把变量打印出来看.其实强大的编辑器已经帮我们做好 ...

  5. PL/SQL连接时,报无法解析指定的字符串

    前言: 工作原因,需要安装PL/SQL连接数据,oracle和PL/SQL都装好了,环境变量也配好了,启动PL/SQL进行连接数据库,结果报"无法解析指定的字符串",连接失败了. ...

  6. window10 查看端口列表 - 查看占用的进程-销毁该进程

    cmd进入指令框后 查看端口列表 netstat -ano 查看占用的进程 [6666是端口号对应的进程数] tasklist|findstr "6666" 销毁该进程 [6666 ...

  7. Linux上天之路(八)之用户和组

    主要内容. 用户创建,删除,修改 密码及密码文件 组创建,删除,修改 组密码及组配置文件 相关文件 Linux用户分类 超级管理员: UID为0 root用户拥有至高无上的命令,root用户不能改名 ...

  8. Hive的基本概念和常用命令

    原文链接: https://www.toutiao.com/i6766571623727235595/?group_id=6766571623727235595 一.概念: 1.结构化和非结构化数据 ...

  9. lvgl移植—Linux fbdev&evdev(基于LVGL v7)

    虽然lvgl官方提供了有关linux framebuffer操作的库函数,但是我决定自己试一下能否自己实现这部分操作 实际项目中应优先采用官方库函数,官方实现代码位于文件夹lv_drivers/dis ...

  10. Java 中如何实现线程间通信

    世界以痛吻我,要我报之以歌 -- 泰戈尔<飞鸟集> 虽然通常每个子线程只需要完成自己的任务,但是有时我们希望多个线程一起工作来完成一个任务,这就涉及到线程间通信. 关于线程间通信本文涉及到 ...