ZSTUOJ 4239 巴比伦花园

好题。

 

先对于每个位置,求出向右延伸的最大长度l[i]。

求法:把所有h[i]都减去i*k,然后就是求  以坐标(i,-i*k)为左下角的最长矩形 ,  可以用单调栈来做。

 

求完l[i],问题就转化成了n条线段,q次询问,问区间内最长线段。

 

这些线段有个性质,就是右端点是相等或者递增的(也就是不下降)。像这样:

 

11111111

01111111

00111111

00011111

0000011111

0000001111

000000011111

假设询问[x,y],于是就可以二分找到第一个达到y的线段,然后就是在x和它之间求个区间最大值就好了。

 

 

poj 3693 后缀数组+ST

枚举长度和起点,枚举起点的时候每次+长度。这样枚举的复杂度是O(nlogn)。

难点就在如何字典序最小。 可以求一下区间的rk的最小值来找这个字典序最小的位置。