ST表解决RMQ问题
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这个区间的最大值 转移方程就是把这个区间分成两个小区间的最大值。 https://www.luogu.com.cn/problem/P3865 https://www.cnblogs.com/zwfymqz/p/8581995.html #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int maxn = 1e6 + 5; int n,m; int dp[maxn][21]; int main() { scanf("%d%d",&n,&m); int num; for(int i=1;i<=n;i++) //初始化,区间长度为1