st表、RMQ和LCA】的更多相关文章

题面:P2880 [USACO07JAN]平衡的阵容Balanced Lineup 题解: ST表板子 代码: #include<cstdio> #include<cstring> #include<iostream> #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) using namespace std; ,max_log=,maxlog=,inf=<<…
Summer again! Flynn is ready for another tour around. Since the tour would take three or more days, it is important to find a hotel that meets for a reasonable price and gets as near as possible! But there are so many of them! Flynn gets tired to loo…
二维RMQ其实和一维差不太多,但是dp时要用四维 /* 二维rmq */ #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; #define maxn 305 int val[maxn][maxn],n,m; ][]; void ST(){ ;i<=n;i++) ;j<=m;j++) dpmax[i][j][][]=v…
传送门:http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23016   Accepted: 8060 Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that,…
类似hdu5289,但是二分更复杂.本题枚举左端点,右端点是一个区间,需要二分找到区间的左端点和右端点(自己手动模拟一次),然后区间长度就是结果增加的次数 另外结果开long long 保存 /** 二分法,枚举左端点,向右寻找第一个最大值不等于最小值的端点 */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> us…
  Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 36864   Accepted: 17263 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer J…
题目链接 题目 Description 给定一个非递减数列Ai,你只需要支持一个操作:求一段区间内出现最多的数字的出现次数. Input 第一行两个整数N,Q 接下来一行有N个整数,表示这个序列. 接下来Q行每行一个操作:A B,询问A到B之间出现最多的数字. 1<=N,Q<=100000.-100000<=Ai<=100000 Output 每组数据若干行,每行对应一个询问的答案. Sample Input 10 3 -1 -1 1 1 1 1 3 10 10 10 2 3 1…
<题目链接> 题目大意:给你一棵带有边权的树,然后进行q次查询,每次查询输出指定两个节点之间的距离. 解题分析:本题有多重解决方法,首先,可用最短路轻易求解.若只用LCA解决本题,也有三种常用的做法,具体方法如下: LCA转RMQ解法: #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <algorithm> using n…
介绍一种解决最近公共祖先的在线算法,st表,它是建立在线性中的rmq问题之上.   代码:   //LCA: DFS+ST(RMQ) #include<cstdio> #include<cctype> #include<iostream> using namespace std; ; int n,m,s,tot; ],f[size<<][],head[size<<],p[size<<][]; bool vis[size]; struc…
RMQ即Range Minimum/Maximun Query,中文意思:查询一个区间的最小值/最大值 比如有这样一个数组:A{3 2 4 5 6 8 1 2 9 7},然后问你若干问题: 数组A下标2~7区间最小的值是多少?       最小值是(1) 数组A下标3~6区间最小的值是多少?       最小值是(4) 数组A下标1~10区间最小的值是多少?      最小值是(1) ...... 专业术语:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标…
我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用. ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把求 LCA 转换为 RMQ问题.我们对于树求一遍欧拉序,就是那个回溯也会记录的那个.我们处理出每个数第一次在欧拉序中出现的位置,欧拉序上每个位置的深度,以及欧拉序上每个位置出现的点的编号.这些信息都可以在一次 \(dfs\) 中求出.然后不难发现在回溯过程中加入的点是之前遍历的点的祖先,由此也不难推…
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq10^5\). \(Solution\) 一个集合直径的两端点,在被划分为两个集合后一定是两个集合直径的四个端点中的两个. 即假设将\(S\)分为两个集合后,另外两个集合的直径的两端点分别为a,b和c,d,那么\(S\)集合的直径的两端点一定是a,b,c,d中的两个. 证明类似树的直径. 所以信息可…
Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30147   Accepted: 15413 Description A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:  In the figure, eac…
51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径 题面 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c<=j<=d} Input 第一行一个数字 n n<=100000. 第二行到第n行每行三个数字描述路的情况, x,y,z (1<=x,y<=n,1<=z<=10000)表示x和y之间有一条长度为z的…
2017-08-26 22:25:57 writer:pprp 题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少? 用ST表即可实现 一开始无脑套模板,找了最大值,找了最小值,分别用两个函数实现,实际上十分冗余 所以TLE了 之后改成一个函数中同时处理最大值和最小值,就可以了 AC代码如下: /* @theme:poj 3264 @writer:pprp @declare:ST表(sparse table)稀疏表,用动态规划的思想来解决RMQ问题: @date:2017…
2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j -1]的最大或者最小值 ST分为两个部分 1.nlogn的预处理 预处理主要用到了动态规划,二分区间每个区间长度为 2 ^ (j -1)找到一个递推关系: F[i][j] = min(F[i][j - 1],F[i + (1 << (j - 1))][j - 1]); 2.查询部分更为巧O(1)得…
传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 66241   Accepted: 30833 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in…
解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - 1],F[i + 1 <  < (j - 1)][j - 1])$ #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath&…
$RMQ$问题:给定一个长度为$N$的区间,$M$个询问,每次询问$[L_i,R_i]$这段区间元素的最大值/最小值. $RMQ$的高级写法一般有两种,即为线段树和$ST$表. 本文主要讲解一下$ST$表的写法.(以区间最大值为例) $ST$表:一种利用$dp$思想求解区间最值的倍增算法. 定义:$f(i,j)$表示$[i,i+2^{j}-1]$这段长度为$2^{j}$的区间中的最大值. 预处理:$f(i,0)=a_i$.即$[i,i]$区间的最大值就是$a_i$. 状态转移:将$[i,j]$平…
思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用  lazy=0 没被覆盖过 else 区间覆盖 push_up的时候要注意好多细节,, 数组尽量往大开 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ; ],lson…
RMQ(Range Minimum/Maximum Query)问题指的是一类对于给定序列,要求支持查询某区间内的最大.最小值的问题.很显然,如果暴力预处理的话复杂度为 \(O(n^2)\),而此类问题数据又往往很大,不仅会爆时间,数组也存不下.我们需要一种能够 \(O(n\log n)\) 甚至 \(O(n)\) 预处理的数据结构,这便是ST表. ST表(Sparse Table,应译为S表)是一种可以以 \(O(n\log n)\) 的优秀复杂度预处理出静态区间上的最大.最小值的算法,其核心…
\(0.\) RMQ问题 P1816 人话翻译 给定一个长度为\(n\)的数列\(a\),然后有\(m\)组询问,每次询问一个区间\([l,r]\)的最小值. 其中\(m,n\leq10^5\) \(1.\) 暴力做法 很显然,暴力做法就是便历 \(\max\limits_{l\leq i\leq r}a_i\) .这个做法最坏时间复杂度将会高达\(O(n^2)\).很显然,这对于\(1e5\)的数据范围要炸 \(2.\) 正解 线段树 如果不知道什么是线段树,请点击这里 线段树 对于这种区间信…
士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀敌数低的人,起到了很好的效果. 所以,南将军经常问军师小工第i号士兵到第j号士兵中,杀敌数最高的人与杀敌数最低的人之间军功差值是多少. 现在,请你写一个程序,帮小工回答南将军每次的询问吧. 注意,南将军可能询问很多…
[51nod 1766]树上的最远点对 (树的直径+ST表求lca+线段树) 题面 给出一棵N个点的树,Q次询问一点编号在区间[l1,r1]内,另一点编号在区间[l2,r2]内的所有点对距离最大值.\(N, Q≤100000\) 分析 看到区间,我们应该想到用线段树维护,区间[l,r]存储编号在[l,r]内的点组成的一棵树的直径端点和长度 考虑如何合并区间.设两个区间的直径分别为(a,b) (c,d),则新区间的直径端点肯定也是a,b,c,d中的一个.(证明显然),那么新区间的直径就是max(d…
在此之前,我写过另一篇博客,是倍增(在线)求LCA.有兴趣的同学可以去看一看.概念以及各种暴力就不在这里说了,那篇博客已经有介绍了. 不会ST算法的同学点这里 ST(RMQ)算法在线求LCA 这个算法的思想,就是将LCA问题转化成RMQ问题. 怎么将LCA转成RMQ? 我们首先用dfsO(N)遍历一遍.比如下图: 得到一个dfs序(从儿子回到父亲也要算一遍): 1->2->4->7->4->8->4->2->5->2->6->9->6…
RMQ RMQ (Range Minimum Query),指求区间最小值.普通的求区间最小值的方法是暴力. 对于一个数列: \[ A_1,~ A_2,~ A_3,~ \cdots,~ A_n \] 对于一个给定的区间\([l, ~r], ~1≤ l ≤r ≤ n\),\(\min \{A_l, A_{l + 1}, \cdots,A_r\}\)的计算就是RMQ问题. 此解法为\(\text{Sparse-Table}\)解法,简称\(ST\)表. 预处理:预处理为对数据进行\(n\log n\…
什么是欧拉序,可以去这个大佬的博客(https://www.cnblogs.com/stxy-ferryman/p/7741970.html)巨详细 因为欧拉序中的两点之间,就是两点遍历的过程,所以只要找遍历过程中对应的最小的深度就行了,这里用st表存,first存第一个u出现的地方,用value存欧拉序,同时用depth存对应深度 模板 struct node{ int v,next,dist; }a[maxn<<]; int n,m,tot,len; ][], depth[maxn<…
RMQ问题: RMQ(Range Minimum/Maximum Query),区间最值查询.对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值. RMQ问题可以用线段树和ST表解决. 线段树:查询复杂度O(log n) 可以修改数列中的值 ST表: 查询复杂度 O(1) 无法修改数列中的值,是在线算法 其实ST表就是个动态规划 核心思想:倍增 对于dp[i][j] ,其含义为以i为起点,长度为2^j这个区间的最大值 转移方程就是把这…
ST表 \(\text{ST}\) 表是用于解决可重复贡献问题的数据结构. 可重复贡献问题:区间按位和.区间按位或.区间 \(\gcd\) .区间最大.区间最小等满足结合律且可重复统计的问题. 模板预处理:(以区间最大值为例) void pre_work() { for(int i=2;i<=n;i++) lg2[i]=lg2[i/2]+1; pow2[0]=1; for(int i=1;i<=lg2[n];i++) pow2[i]=pow2[i-1]*2; for(int i=1;i<…
ST表 ST表是一种解决RMQ问题的强有力工具, 可以做到O(nlogn)预处理,O(1)查询. st[i][j] 表示区间 [i, i + 2 ^ j - 1] 的最大值. 初值 st[i][0] = a[i]. 状态转移 st[i][j] = max(st[i][j - 1],  st[i + 2 ^ ( j - 1)][j - 1]).. 初始化: inline void init(){ for(int i = 1; (1 << i) <= n; i ++) for(int j =…