参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/2633486.html 3. 代码来源yejinru 题意: 有一棵树, 按照顺序给出每条边, 再给出若干对点, 这两点之间的唯一的路( Simple path )上边权加1. 当所有对点处理完后, 按照边的输入顺序输出每条边的权. 思路: LCA问题. 最近公共祖先(Least Common Ancestors…
They say that Berland has exactly two problems, fools and roads. Besides, Berland has n cities, populated by the fools and connected by the roads. All Berland roads are bidirectional. As there are many fools in Berland, between each pair of cities th…
题目链接:Codeforces 191C Fools and Roads 题目大意:给定一个N节点的数.然后有M次操作,每次从u移动到v.问说每条边被移动过的次数. 解题思路:树链剖分维护边,用一个数组标记就可以,不须要用线段树. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e5 + 5; int N, Q, ne, fi…
转载自:http://kmplayer.iteye.com/blog/575725 RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题 主要方法及复杂度(处理复杂度和查询复杂度)如下: 1.朴素(即搜索) O(n)-O(n) 2.线段树(segment tree) O(n)-O(qlogn) 3.ST(实质是动态规…
RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题 主要方法及复杂度(处理复杂度和查询复杂度)如下: 1.朴素(即搜索) O(n)-O(n) 2.线段树(segment tree) O(n)-O(qlogn) 3.ST(实质是动态规划) O(nlogn)-O(1) 线段树方法: 线段树能在对数时间内在数组区间上进…
ST算法------是用来求解给定区间RMQ的最值,本文以最小值为例 ST算法分为两部分 离线预处理(nlogn):运用DP思想,用于求解区间最值,并保存到一个二维数组中. 在线查询 (O(1)):对给定区间进行分割,借助该二维数组求最值 离线预处理 该二维数组是什么? 设该二维数组为dp[n][n], 则dp[i][j]表示以i为起点,以2^j为区间长度的区间最值即表示数组[i, i+2^j-1]区间的最值. 给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最…
给定一个数组,求出给定区间[l,r]中元素的最大值或最小值或者最值的索引. 一看到这个题目,简单,看我暴力出奇迹.暴力当然是可行的.但是时间复杂度很高(O(n^2)).线段树,树状数组也可以解决这个问题,复杂度(O(nlogn))的预处理,最终查询为O(次数*logn). 而今天用ST(Sparse_Table)算法,也是O(nlogn)的预处理,但是是单次查询为O(1),挺高效的. 我们现在给定一组数据 n==9,元素为2,4,6,8,9,1,2,3,4.一个二维数组f[MAX][MAX];假…
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47319 题目大意:给定一个序列,要求确定一个子序列,①使得该子序列中所有值都能被其中一个值整除,②且子序列范围尽可能大(r-l尽可能大). 解题思路: 对于要求1,不难发现只有min(L,R)=gcd(L,R)时才行.其中gcd是L,R范围内的最大公约数,min是L,R范围内的最小值. 对于要求2,传统思路是r-l从大到小枚举,每次确定一个(L,R)范围,进行判…
RMQ问题之ST算法 RMQ(Range Minimum/Maximum Query)问题,即区间最值问题.给你n个数,a1 , a2 , a3 , ... ,an,求出区间 [ l , r ]的最大值. 举例:a={ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 },求出区间[4 ,8]中的最值.(答案:8 ) 这个问题最朴素的想法是用一个循环每次比较大小,但是,当数据范围较大时,这个算法十分低效.这时我们往往使用 ST 算法解决这个问题.虽然线段树和树状数组都能解决,但…
ST算法: ID数组下标: 1   2   3   4   5   6   7   8   9    ID数组元素: 5   7   3   1   4   8   2   9   8 1.ST算法作用: 主要应用于求区间最值上,可以把所需要求的区间极大的压缩,并且查询的复杂度为O(1).比如我们要求一段区间上的最大值,就算是用DP的思想去做,用DP[i][j]表示从i到j区间的最大值,如果需要保存数据元素N比较多的时候,比如N=10000的时候,你开个二维数组肯定超内存,如果你用线段树做的,或…