首页 > 其他分享 >虚树学习笔记

虚树学习笔记

时间:2024-04-08 19:36:20浏览次数:28  
标签:sum 笔记 operatorname 学习 LCA 节点 虚树 关键点

关于虚树

对于一些在树上进行某些询问的查询,且每个询问实际用到的点并不多的时候,可以考虑建虚树来查询。

虚树的建立复杂度是 \(O(m \log n)\) 的,\(m\) 是虚树节点数量,\(n\) 是原树节点数量。也有方法可以做到 \(O(m \log m)\)。

例题

题目链接

分析

注意到范围:\(\sum k_i \le 5 \times 10^5\),所以考虑虚树。

对于暴力做法,定义状态函数 \(f_i\) 表示使 \(i\) 不和其为根的子树中任意一个关键点联通的最小代价。不难有转移方程:

\[f_u = \left\{\begin{matrix} f_u + \min (f_v ,w_{u,v}) & [v~不是关键点]\\ f_u + f_v & [v~是关键点] \end{matrix}\right. \]

可以发现,我们实际上有用的点只有所有的关键点,任意两个关键点的 \(\operatorname{LCA}\) 和节点 \(1\)。如果我们建立一棵只有这些点的树,那么上面的暴力就可以用复杂度为 \(O(m)\) 的暴力实现。由于 \(m \le 2 \times k\),显然是可以过的。

建立虚树

这里介绍二次排序的做法。

先将所有的关键点按照 DFS 序排序。那么任意两个关键点的 \(\operatorname{LCA}\) 就相当于排序后相邻的两个关键点的 \(\operatorname{LCA}\)。

证明:
咕......

将得到的点再次排序去重后,就得到了虚树的所有节点。现在就只需要根据原树上节点祖孙关系给它们建边了。枚举相邻两个节点,然后将 \(a_i\) 成为 \(\operatorname{LCA}(a_{i-1},a_i)\) 在虚树上的儿子,虚树就建完了。

证明:
如果 \(x\) 是 \(y\) 的祖先,那么 \(x\) 直接到 \(y\) 连边。因为 dfn 序保证了 \(x\) 和 \(y\) 的 dfn 序是相邻的,所以 \(x\) 到 \(y\) 的路径上面没有关键点。
如果 \(x\) 不是 \(y\) 的祖先,那么就把 \(\operatorname{LCA}(x,y)\) 当作 \(y\) 的的祖先,根据上一种情况也可以证明 \(\operatorname{LCA}(x,y)\) 到 \(y\) 点的路径上不会有关键点。
所以连接 \(\operatorname{LCA}\) 和 \(y\),不会遗漏,也不会重复。

复杂度 \(O(m \log n)\),最后跑一遍暴力就行了。

练习题

CF613D

对于 DP,定义状态函数 \(f_i\) 表示使以 \(i\) 为根的子树中任意两个关键节点都不联通的最小代价,\(g_i\) 表示以 \(i\) 为根的子树中是否剩下 \(1\) 个与 \(i\) 联通的点关键点。则有转移方程:

\[f_u = \sum f_v + (\sum g_v)[u ~ 是关键点] + 1[u ~ 不是关键点 \land (\sum g_v)>1] \]

\[g_u = \left\{\begin{matrix} 1 & [v~是关键点 \lor(v ~ 不是关键点 \land (\sum g_v) >1)]\\ \sum g_v & [v ~ 不是关键点 \land (\sum g_v) \le 1)] \end{matrix}\right. \]

答案为 \(f_1\)。对于无解的情况,就是相邻两个节点都是关键点,这个在读入的时候判断即可。

世界树

咕......

大工程

问题 \(1\)

定义 \(cnt_i\) 表示 \(i\) 为根子树中关键点的数量(不包含 \(i\)),\(sum_i\) 表示 \(i\) 为根子树所有关键点到 \(i\) 的距离。

则从 \(i\) 的 \(x\) 子树中选一个关键点,从 \(i\) 的另一个子树中选一个关键点的路径长度和就是 \((cnt_i - (cnt_x+1) ) \times (w_{i,x} \times (cnt_j+1) +sum_j)\)。

从 \(i\) 的 \(x\) 子树中选一个关键点到 \(i\)(\(i\) 是关键点)的路径长度和为 \(sum_i\)。

\(sum_i =\sum sum_x +w_{i,x} \times (cnt_x+1)\)。

问题 \(2,3\)

存下 \(i\) 为根子树中关键点到 \(i\) 的最短和最长路。同问题 \(1\) 的 \(2\) 种情况分讨即可。

Railway

标签:sum,笔记,operatorname,学习,LCA,节点,虚树,关键点
From: https://www.cnblogs.com/harmisyz/p/18122371

相关文章

  • 虚数学习笔记
    虚树详见OI-Wiki。其实就是把原树浓缩成\(k_i\)数量级的小树,题目会保证\(\sumk_i\)和\(n\)同阶,于是每次询问暴力dp就是对的了。但是OI-Wiki并未提到为什么dp用到的所有点是关键点本身和排完序后每相邻两个关键点的LCA呢?证明虚树的建立:ilboolcmp(inta,i......
  • 具体数学学习笔记(更新中)
    第五章5.1组合数基础P1405.24求证:\[\sum_k\binoml{m+k}\binom{s+k}n(-1)^k=(-1)^{l+m}\binom{s-m}{n-l}\]H_W_Y老师有点太强了,归纳法纯shaber,考虑直接推式子:\[LHS=\sum_{k}\binom{m+k-l-1}{m+k}\binom{n-s-k-1}{n}(-1)^{m+n}\\=(-1)^{m+n}\sum_k\binom{m-l-1+......
  • Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码
    Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibiliUI_CraftWindow.csusingUnityEngine.UI;usingTMPro;usingUnityEngine;usingU......
  • FPGA入门笔记011_B——搭建串口收发与存取双口RAM简易应用系统
    1、实验现象​ 通过串口发送数据到FPGA中,FPGA接收到数据后将数据存储在双口ram的一段连续空间中,通过QuartusII软件提供的In-SystemMemoryContentEditor工具查看RAM中接收到的数据。当需要时,按下设计好的按键,则FPGA将RAM中存储的数据通过串口发送出去。2、......
  • 大菜菜学习RabbitMQ——第二篇
    我在上一节讲述了如何使用Rabbitmq图形化界面在我们学习这个的基础使用,然后我们现在就要做的就是用java进行rabbitmq操作首先在黑马课上有一个mq-demo文件这个资料,各位可以去微信程序里面下载对应资料包,然后会在百度网盘里链接:https://pan.baidu.com/s/1VFdBOQYZVACxUBkzBuLVHA......
  • 大菜菜学习RabbitMQ——第一篇
    现在开始呢我在学MQ,首先这篇博客,如果需要借鉴的话,前提是,你要有消息队列对应的前置知识,如果没有的话可以去B站或者去其他的博客上面学习不多逼逼,现在开始首先是localhost:15672,如果你下载好了rabbitmq,这个应该是很不陌生的,对于刚开始使用者来说就是guest,但是我们其实可以添加用户......
  • [网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
    文章目录一.工具&术语1.网安术语2.常用工具3.推荐文章二.常见攻击1.SQL注入2.XSS跨站3.越权漏洞4.CSRF跨站请求伪造5.支付漏洞三.音乐异或解密示例四.总结一.工具&术语1.网安术语常见安全网站及论坛:看雪(https://bbs.pediy.com/)安全客(https://www.anquanke.com)fre......
  • JavaScript学习 BOM操作
    BrowserObjectModel(BOM) 是一套专为与浏览器交互而设计的API,它允许JavaScript访问和操纵浏览器窗口以及浏览器本身的相关特性。以下是对BOM主要对象及其操作的详细讲解:1.Window对象Window对象 是BOM的核心,它代表浏览器窗口,并且是JavaScript全局对象。这意味着所有全局......
  • 【笔记】栈(Stack)
    一、什么是栈栈:一种特殊的线性表,其只允许在固定的一端(也就是在表尾)进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任何数据元素的栈称为空栈 。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。注意:1、栈是一个线性表,那......
  • Vue3 · 小白学习全局 API:常规
    全局API:常规本次笔记versionnextTick()defineComponent()defineAsyncComponent()defineCustomElement()1.version暴露当前所使用的Vue版本。类型string示例import{version}from'vue'console.log(version)2.nextTick()等待下一次DOM更新刷新的工具......