关于RMQ
区间最值查询算法
针对多次的区间最值的查询问题,暴力的算法是在每一次查询中进行遍历求值
明显发现计算过程中会出现遍历覆盖的问题
这种遍历覆盖不固定,所以可以依靠有界的预处理解决
边界的选择,需要满足区间全覆盖、各区间均有解,且,分块从属尽可能多的特点
此处二分边界就是最优选择
RMQ算法,Range Maximum/Minimum Query
将一个大区间分为两个长度为2^k的小区间,比较这两个小区间的最值,得到大区间的最值
简易之处在于,小区间经过预处理之后,可以被更小数量级地存储
也就是略去了不必要的小区间,留下可重复贡献区间
算法有两个重点,一个是边界,一个是小区间长度
所以对于代码实现,以二者为下标,维护一个二维数组,把最值记成存储数据即可
也就是st表,线段树先略
for(ri j=1; j<=log2(n); ++j)
for(ri i=1; i+1<<j-1<=n; ++i)
f[i][j]=max(f[i][j-1],f[i+1<<(j-1)][j-1]);
预处理时间复杂度O(nlogn),查询时间复杂度O(1)
至于修改,待定
关于简单的应用
数列区间(模版)
矩阵最值
人类基因
关于一些灵活的
降水量
超级钢琴