ST&倍增LCA
回顾st算法,它的一大功能是求区间最值。先将整个区间划分成若干个小的区间,求出最值,然后将小的区间合并成一个大的区间,我们这里要用到一个数组minn[i][j],划重点!如果我们要求的是区间最小值,minn[i][j]代表的是从i开始往后2^j个数,这一个小区间的最小值。那么最开始minn[i][0]就是第i个数自己,那么涉及算法的主体部分来了,当我们将这若干个minn[i][0]合并成一个大的区间时,这个大区间的范围就是前一个范围的两倍(因为倍增后两个等大的小区间合成一个大区间),即
minn[i][j]=min(minn[i][j-1],minn[i+(1<<(j-1))][j-1])
- void rmq()
- {
- for(int i=;i<=n;i++)
- minn[i][]=a[i];
- for(int j=;<<j<=n;j++)
- for(int i=;i+(<<j)-<=n;i++)//为什么要减一 可以画图试试
- minn[i][j]=min(minn[i][j-],minn[i+(<<(j-))][j-]);
- }
预处理完了之后便是对每个询问的查询,关于查询,假设我们要查询的区间为[l,r],那么区间长度就是r-l+1。
- int query(int l,int r)
- {
- int k=;
- while(<<(k+)<=r-l+)//找到最大的子区间
- k++;
- return min(minn[l][k],minn[r-(<<k)+][k]);//区间重叠的情况
- }
假如2*k大于r-l+1,我们就查询l往后2^k个数和r往前2^k个数,即便中间出现重复查询的情况也是合理的,这样便不会超出r-l+1的长度
关于LCA的st算法
LCA问题大体是求最近公共祖先,顾名思义,给定一棵树,对于每个询问,求出询问的两个节点的最近公共祖先
如图,假设我要求结点6和9的最近公共祖先,我们要做的是先从根结点开始进行深搜并记录每次深搜到的结点 即遍历顺序(包括)回溯,以及每个结点的深度,那么这棵树的遍历顺序便是
1 5 6 5 7 9 7 8 7 5 1 2 3 2 4 2 1
然后我们找6和9第一次出现的序号 分别是3和6,不难发现,我们要找的最近公共祖先就是在第三个数和第六个数之间,剩下的只需要判断在第三和第六个数之间哪一个数所代表结点的深度最小即可:
遍历序号 | 3 | 4 | 5 | 6 |
代表的结点 | 6 | 5 | 7 | 9 |
深度 | 3 | 2 | 3 | 4 |
因为从一个结点遍历到另一个节点肯定会经过它们的公共祖先,且是最近公共祖先,所以只需要用st求这区间结点的最小深度,然后把这个结点输出,便是最近公共祖先
下面是dfs的过程
- void dfs(int node,int cur)
- {
- check[node]=;
- dep[node]=cur;
- book[node]=++sum;
- dfn[sum]=node;
- int i=frst[node];
- while(i!=-)
- {
- if(!check[v[i]])
- {
- dfs(v[i],cur+);
- dfn[++sum]=node;
- }
- i=nst[i];
- }
- }
- //cur代表当前结点的深度,sum代表的是当前结点的遍历序号,这里用链式前向星存图
ST&倍增LCA的更多相关文章
- 倍增小结 ST 与 LCA
倍增 倍增我是真滴不会 倍增法(英语:binary lifting),顾名思义就是翻倍. 能够使线性的处理转化为对数级的处理,大大地优化时间复杂度. (ps:上次学倍增LCA,没学会,老老实实为了严格 ...
- Codeforces 418d Big Problems for Organizers [树形dp][倍增lca]
题意: 给你一棵有n个节点的树,树的边权都是1. 有m次询问,每次询问输出树上所有节点离其较近结点距离的最大值. 思路: 1.首先是按照常规树形dp的思路维护一个子树节点中距离该点的最大值son_di ...
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)
洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...
- 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- 倍增LCA学习笔记
前言 "倍增",作为一种二进制拆分思想,广泛用于各中算法,如\(ST\)表,求解\(LCA\)等等...今天,我们仅讨论用该思想来求解树上两个节点的\(LCA\)(最近公共祖先 ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- [板子]倍增LCA
倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
随机推荐
- iOS 判断一个类是否存在,NSStringFromClass 不用 import 就可以获取类
Class myCls = NSClassFromString(@"Person"); NSString *str = NSStringFromClass(myCls); if ( ...
- easyui datagrid 后台分页,前端如何处理
module.exports = { queryMethod(){ let params = checkQueryParams.call(this); if (!params) { return; } ...
- docker学习常用指令---第五章节
前面我们了解了docker的基本概念,和docker镜像,端口相关的内容.在具体的实际操作过程中,我们需要了解一些相关的docker操作指令. 一.Docker save指令 指令功能:将指定镜像保存 ...
- python flask 如何修改默认端口号
场景:按照github文档上启动一个flask的app,默认是用5000端口,如果5000端口被占用,启动失败. 样例代码: from flask import Flask app = Flask(_ ...
- 函数QFileSystemModelPrivate::_q_fileSystemChanged
由于Qt的体系过于庞大,即使是某个模块,分析起来也十分困难.对于QFileSystemModel,我们在这里对单个重要函数慢慢分析 1 /*! \internal The thread has rec ...
- carthage和cocoapods
http://www.jianshu.com/p/b5607b8b9348 http://www.jianshu.com/p/5ccde5f22a17 1.在brew install carthage ...
- SpringBoot统一异常处理
/** * 异常处理器 */ @RestControllerAdvice // public class BDExceptionHandler { private Logger logger = Lo ...
- Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发WebFlux 支持两种编程风(姿)格(势) 使用@Controller这种基于注解
概述 什么是 Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发框架. 要深入了解 Spring WebFlux, 首先要了知道 R ...
- AI五子棋第四周——接近尾声
欢乐时光过得特别快~ 真是快乐的一周,就是项目进展几乎纹丝不动. 燃尽图?? (添加了背景音乐,找到了一个很好的音乐素材网站!) (添加了俩图标:重开,和音乐.) (调了一下前后端通讯,基本能通话了, ...
- JIRA 7.8 版本的安装与破解
jira的运行是依赖java环境的,也就是说需要安装jdk并且要是1.8以上版本 除此之外,我们还需要安装MySQL,为jira创建对应的数据库.用户名和密码,如下: 注意:建库名jira,字符集为U ...