今天学习了一下st表 其实好几天就一直看 用禚神仙的话来说: st表不支持在线修改 不支持!!!!! 一种利用dp求解区间最值的倍增算法。 定义:f[i][j]表示i到i+2^j-1这段区间的最大值。这里必须是i到i+2的j次方-1 别问为什么 规定!!! 预处理:f[i][0]=a[i]。即i到i ...
分类:
其他好文 时间:
2018-09-22 19:56:08
阅读次数:
361
【模板】最近公共祖先(LCA) 题意 给一个树,然后多次询问(a,b)的LCA 模板(主要参考一些大佬的模板) cpp include //自己的2点:树的邻接链表(静态)表示; lca 的倍增算法 //优化 log[] const int maxn=500010; int N,M,S;//S根节点 ...
分类:
其他好文 时间:
2018-08-24 23:41:27
阅读次数:
210
在上一篇求LCA的文章中,我们使用了倍增的算法(可以认为是二分思想的逆用),在这里我们来简单了解一下倍增算法的思想。 有这样一个问题,现在有一个数字n,现在要求将n分解为2的幂之和(n = ∑(20 + 21 + 22 + …… + 2i-1 + 2i)),要怎么做?下面来介绍该怎么办,为了说明方便 ...
分类:
编程语言 时间:
2018-07-28 15:20:50
阅读次数:
199
原本计划上个星期写这篇博客,但是被耽误了一周。今晚来填坑。首先来介绍最近公共祖先(LCA)的概念:最近公共祖先_百度百科。这里我们介绍利用倍增求LCA。 先来了解一下倍增的思想:倍增简介_博客。 假设询问的两点为u、v,对于如何求最近公共祖先,倍增算法的思想是这样的: (1)预处理得到每个节点的二次 ...
分类:
其他好文 时间:
2018-07-26 23:43:07
阅读次数:
307
http://www.cnblogs.com/zhouzhendong/p/7256007.html LCA 最近公共祖先,只在同一个树中距离两个子节点最近的那个父节点。 在网上最快的有两种算法分别是算法发明家——Tarjan 以他名字发明的算法,和倍增算法,和树剖。 而Tarjan算法几乎只能求两 ...
分类:
其他好文 时间:
2018-07-17 21:11:36
阅读次数:
202
算法: 求出MST之后枚举每条在MST之外的边 连上之后会出现环 找到环中除加上的边之外权值最大的边 删除该边之后得到一颗新树 做法: 利用LCA倍增地维护最小生成树上两点之间的最大边权 每次枚举在MST之外的边 有两种情况 ①.两个端点在一条链上 ②.两个端点不在一条链上 第一种情况就直接得到答案 ...
分类:
其他好文 时间:
2018-07-14 20:01:24
阅读次数:
185
还是基本的问题,求LCA。 详情见: https://blog.csdn.net/saramanda/article/details/54963914 讲得非常好了。 fa[i][j]=fa[ fa[i][j-1] ][j-1] 用文字叙述为:i的第2^j个父亲 是i的第2^(j-1)个父亲的第2^ ...
分类:
编程语言 时间:
2018-07-03 15:14:09
阅读次数:
131
5165: 树上倍增 Description 现有一棵树。您需要写一个树上倍增算法,以实现如下操作: A x 新建一个节点,将它作为x节点的儿子,编号为当前节点总数+1。 Q k p1 p2 p3.... 查询p1,p2,p3...这些节点的LCA。其中k表示查询节点的个数。 最初树上只有一个节点, ...
分类:
其他好文 时间:
2018-06-30 16:58:21
阅读次数:
152
【最近公共祖先】 〖模板代码〗 [倍增算法] 1 void dfs(int k) 2 { 3 for(int i=1;(1<<i)<=deep[k];i++) 4 x[k][i]=x[x[k][i-1]][i-1]; 5 for(int i=head[k];i;i=e[i].next) 6 { 7 ...
分类:
编程语言 时间:
2018-04-20 00:04:04
阅读次数:
224
倍增算法(da) DC3 http://www.spoj.com/problems/DISUBSTR/ spoj 694 求不同子串的个数 到今天才是1/8的男人 http://poj.org/problem?id=1743(楼教主的男人八题之一) 求不重叠的最长公共串 uva11107 输入n个D ...
分类:
编程语言 时间:
2018-04-14 15:20:52
阅读次数:
196