ST表

  突然看见能快速求 区间最大值 神奇呢。

这道题呢 首先一看 sort +单调队列啊 一股热血涌上心头 然后写了sort 把排序结果输出后 关掉程序

这个不能写单调队列 不行 左端点右端点都不单调,尽管我保证左端点或右端点其中一个单调,但是另一个依然不单调所以用不了单调队列。

如上图所示样例的排序 单调队列废了但是 这道题 的题目是ST表 所以我可以搞一些事情 。

比如看书TAT 看书看不懂啊 找博客 终于大致理解了自己写了一个ST表 wa到30 发现区间大小没看见。

这里讲一下我对ST表的理解:

利用倍增思想 提前预处理出 i~i+2^j-1区间的最大值,这时我们就可以 O(1)的时间内求出 某个区间的最大值了。

f[i][j] 表示 从 i到i+2^j-1这个区间的最大值 很显然的状态转移方程 f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);

这个有点像倍增LCA预处理的时候 当然f[i][0]=a[i];

对于一个区间 L R我们可以 (*^▽^*) 直接查找即可 首先第一步要找到一个K使 L+2^K-1<=R

那么这个K也有一个反作用就是 R-(2^k)+1>=L; 于是 我们的答案 max(a[L~R])=max(f[L][k],f[R-2^k+1][R]);

当然 K=log(R-L+1)/log(2);//注意这里不是log(R)我就是在这里错的,真笨啊我。

当然这个思想的证明或者说是一些细微的地方例如为什么我们一定能找到了答案所在的区间是否有可能找不到,

关于证明我还不会,但是仔细想想是它的正确性不言而喻。

还有状态的表示为什么是 2^j-1 却不是2^j 我想应该是区间的大小为2^j 这样转移能够转移。

江天日暮,何时重与细论文。绿杨阴里,听阳关、门掩黄昏。

posted @ 2019-02-20 18:52  chdy  阅读(189)  评论(1编辑  收藏  举报