RMQ问题
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。
主要方法(线段树,ST表,LCA)
1.线段树
支持修改,时间复杂度:预处理O(n),查询O(log(n))
例:HDU1754
#include
#include
#include
#include
#include
#include
#include
2.ST表
以倍增思想为基础,不能在线修改,适合离线RMQ问题
时间复杂度: 预处理O(nlog(n)) 查询O(1)
预处理:先开辟一个数组\(f[i][j]\)表示从第i号节点到第i+2^j-1号节点的最大值,即从i号节点开始往后数共2^j个节点中的最大值。
查询:查询x,y之间的最大值,记len为[x,y]区间长度 ,最大值=max\((f[x][log {len}],f[y-2^{log{len}}+1][log{len}])\)
具体思路参考这篇博客
例:洛谷p3865
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize ("unroll-loops")
#include
#include
#include
#include
#include
#include
#include
3.LCA
太菜了,还不会....以后再写