题目描述
题解
看到题目问的是最小值的最大值,显然可以二分求解
给出的高度在$10^9$范围内,需要先对高度进行离散化
假如我们二分出了一个$mid$,怎么判断它是否合法?可以这么解决,将所有数大于等于$mid$的数赋为$1$,其余赋为$0$,那么就是判断$[l,r]$之间是否存在一个长度大于等于$k$的连续的$1$
可以对所有高度建一棵线段树,维护区间内最长$1$的长度,从左和从右开始最长$1$的长度,但是这样空间复杂度爆炸。我们可以使用主席树来维护。
可以按高度从大到小建树,保证大于等于它的数的位置都赋值了
初始时要建树计算一下区间长度,否则在pushup时判断时会出错1
2if(tree[ls(k)].lmax == tree[ls(k)].len) ···
if(tree[rs(k)].rmax == tree[rs(k)].len) ···
Code
1 |
|