两种降时间复杂度的方法
离线查询(做起来容易):CDQ分治
在线查询:树套树
倍增
RMQ
区间最值查询Range Minimum/Maximum Query:给定一个数组,求出给定区间[l,r]最值的下标
倍增最关键的地方是:绝对不会走都是相同的步数(比如说走两步可以到达的地方绝对不会分两个一步走)
其次可以想到:成倍的增长->2(1,2,4,8,16…)
ST(Sparse Table)算法:O(nlogn)预处理,O(1)查询
求最小值
1.预处理(动态规划)
f(i,j)表示区间[i,i+2j-1]
第i个点到第i+2j-1个点的最小值
即f(i,0)表示区间[i,i]的最小值(即这个值)、f(i,1)表示区间[i,i+1]、f(i,2)表示区间[i,i+3]、f(i,3)表示区间[i,i+7]~i+15,i+31+…依次类推
用动态规划的思想,大区间的最小值可以由小区间的最小值转移而来,由此我们可以发现区间[i,i+2j-1]的最小值可以由区间[i,i+2j-1-1]的最小值和[i+2j-1,i+2