[BZOJ1602&BZOJ1787&BZOJ2144]树上LCA的算法巩固练习
简述求LCA的倍增算法
对于树上的所有节点,我们可以很轻松地通过dfs求出其直接的父亲节点以及其深度
通过类似RMQ的原理我们可以处理出每个节点的第2^i个父亲
//这个过程既可以在dfs之后双重循环建也可以像树剖模板里那样dfs里直接建
//个人比较推荐后者,会少掉一些不必要的运算,但由于log算法的优越性使得它们实际差别不大
如图u,v为题目中给的两个节点,我们要做的第一步是将u,v调整到同一深度
做法很简单,只需要用2^i从大到小逼近答案
调整到同一深度以后两个节点共同前进,做法和上面调整深度时一样
细节:
当u,v的深度刚开始就相同时一定要特判,因为运算到ln(0)会出错
BZOJ1602 简单的LCA模板题
BZOJ1787 题目大意是让我们求出树上三个点到同一点的边权加和最小,输出那个点和最小边权
我们通过上面的例子可以发现,并不是三点的LCA就是边权和最小的
因为图上的红边如果走到红色节点的时候会走两次,而走到绿色节点时只走一次,其他路径上的节点各一次
发现其实和树的重心有点关系...然后就想到了暴力滚粗的ZJOI Day1T1
其实这道题没那么麻烦...因为只有三个点,很容易想到最终的答案一定是其中两个点的LCA
那么枚举三次就可以了,先将其中两个点做一次LCA,求出路径边权和,再将这个新求出的点和剩下的点做LCA,求路径和
第一问的答案就是第一次LCA后求出的那个点
BZOJ2144
几乎看不出来和LCA有什么关系的题...
但是想出来了之后觉得这个思路简直太好了...
对于一个状态我们用三元组表示(x,y,z)
一种转移是从外面的点跳向中间,而显然由于题目中“只能跳过一颗棋子”的限制所以只有一种方法
而从中间的点跳向两边就有两种方式
按照以前的思路,这里就直接BFS敲起来了..
我们考虑每一个三元组不停地向中间跳一定有一个最终状态
而这个最终状态向外跳又能产生一系列形如二叉树的状态
我们将向外跳定义为向儿子状态的连边,向上条定义为向父亲节点的连边
两个状态的树上路径长度正好的题目中要求的内容
而第一问只需判断根节点的状态是否一样就可以了
但对于10^9的数据,想到这里显然还不够
我们面临着两个问题,一个是depth怎么求(数组根本开不下状态也枚举不完),第二个是第2^i个父亲怎么求
我们发现这两个问题是有联系的
考虑一个状态(x,y,z),设t1=y-x,t2=z-y
当t1>t2时,显然是右边的z往左跳,但是可以跳几步呢?我们解不等式即可得出:(t1-1)div t2步
当t2>t1时同理
每次更新t1,t2我们发现它实际上是一个辗转相除的过程,也就是没有几步就可以到达根节点
也可以根据这个过程叠加出深度
也可以根据这个过程,算出已知状态的第2^i个父亲状态
这样一来,这个问题就差不多解决了
最后一个细节,读进来的状态是无序的,要排序后再做/w\
[BZOJ1602&BZOJ1787&BZOJ2144]树上LCA的算法巩固练习的更多相关文章
- 最近公共祖先LCA(Tarjan算法)的思考和算法实现
LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...
- LCA:Tarjan算法实现
本博文转自http://www.cnblogs.com/JVxie/p/4854719.html,转载请注明出处 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有 ...
- 最近公共祖先LCA(Tarjan算法)的思考和算法实现——转载自Vendetta Blogs
LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 小广告:METO CODE 安溪一中信息学在线评测系统(OJ) //由于这是第一篇博客..有点瑕疵...比如我把false写成了f ...
- LCA倍增算法
LCA 算法是一个技巧性很强的算法. 十分感谢月老提供的模板. 这里我实现LCA是通过倍增,其实就是二进制优化. 任何一个数都可以有2的阶数实现 例如16可以由1 2 4 8组合得到 5可以由1 2 ...
- 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 D.寻找-树上LCA(树上a到b的路径上离c最近的点)
链接:https://ac.nowcoder.com/acm/contest/558/D来源:牛客网 寻找 小猫在研究树. 小猫在研究树上的距离. 给定一棵N个点的树,每条边边权为1. Q次询问,每次 ...
- POJ 1330 Nearest Common Ancestors (LCA,倍增算法,在线算法)
/* *********************************************** Author :kuangbin Created Time :2013-9-5 9:45:17 F ...
- Tarjan的LCA离线算法
LCA(Least Common Ancestors)是指树结构中两个结点的最低的公共祖先.而LCA算法则是用于求两个结点的LCA.当只需要求一对结点的LCA时,我们很容易可以利用递归算法在O(n)的 ...
- 最近公共祖先 LCA 倍增算法
树上倍增求LCA LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 ...
- hdu-3078 Network(lca+st算法+dfs)
题目链接: Network Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) P ...
随机推荐
- 『AngularJS』ngValue
原文 描述 绑定给定的表达式到input[select]或input[radio]的值,以便当这个元素被选中的时候,设置这个元素的ngModel到绑定的值.当需要使用ng-repeat来动态生成rad ...
- es2017中的async和await要点
1. async和await最关键的用途是以同步的写法实现了异步调用,是对Generator异步方法的简化和改进.使用Generator实现异步的缺点如下: 得有一个任务执行器来自动调用next() ...
- Qt 飞机仪表显示
使用Qt简单谢了一个飞机的一小部分仪表,还没有写完,目前只写了一个界面,不过思想应该是一样的. 效果图如下 其中主要由转速表,和下面的部分数字显示构成 转速表代码 .h文件 #ifndef CONTR ...
- Jmeter和Charles下载文件
有时候我们jmeter做自动化测试是会遇到文件上传和文件下载的接口,这里我将接结合Charles来Jmeter 文件下载进行讲解 一.用Charles抓包分析文件下载接口 1.1.业务中文件下载链接如 ...
- lua优化
前言 Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏.像<魔兽世界>的插件,手机游戏<大掌门><神曲><迷失之地>等都是用Lua来 ...
- Spring Boot 学习随记
微架构的思想在各大互联网公司越来越普及,特此记录Spring Boot的一些细节问题! 网上spring-boot的教程一堆一堆,就没有必要再详细记录了 1:建议通过Idea 来创建spring-bo ...
- tensorflow Importing Data
tf.data API可以建立复杂的输入管道.它可以从分布式文件系统中汇总数据,对每个图像数据施加随机扰动,随机选择图像组成一个批次训练.一个文本模型的管道可能涉及提取原始文本数据的符号,使用查询表将 ...
- MySQL查询所有库中表名
select table_name from information_schema.tables where table_schema='contract_ggpt' and table_type=' ...
- windows下git hub的GUI软件配置与使用
转载自:http://www.cnblogs.com/haore147/p/3618930.html 1. 安装两个软件 1 2 1. git的命令行程序--git for windows:htt ...
- 父窗体和子窗体的显示,show&showdialog方法
showdialog(): 子窗体弹出后,不能对父窗体进行操作.show()可以. 具体原理: 1.在调用Form.Show方法后,Show方法后面的代码会立即执行 2.在调用Form.ShowDi ...