ST表
ST表的功能很简单
它是解决RMQ问题(区间最值问题)的一种强有力的工具
它可以做到O(nlogn)预处理,O(1)是查询最值
像线段树是O(logn)的查询
算法
ST表是利用的是倍增的思想
拿最大值来说
我们用st[i][j]表示,从i位置开始的2^j个数中的最大值,例如st[i][1]表示的是i位置和i+1位置中两个数的最大值
那么转移的时候我们可以把当前区间拆成两个区间并分别取最大值(注意这里的编号是从1开始的)
查询的时候也比较简单
我们计算出log2(区间长度)
然后对于左端点和右端点分别进行查询,这样可以保证一定可以覆盖查询的区间
刚开始学的时候我不太理解为什么从右端点开始查的时候左端点是r-2^k+1r−2k+1
实际很简单,因为我们需要找到一个点x,使得x+2^k-1=r
这样的话就可以得到x=r−2^k+1
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int st[N][21];
int query(int l,int r)
{
int k=log