题目链接
题目大意:
求一段序列的 (h[i]+h[j])*(j-i) 的最大值
step1: 转化一下题意
(h[i]+h[j])(j-i) = ( h[j] - (-h[i]) )(j-i)
令a[i] = -h[i] ,b[i] = h[i]
然后全部转化为两种坐标 (i,a[i]) (i,b[i])
这样题目就转化成了在一个坐标系中 求最大矩形的面积(选出左下角和右上角的点)
step2: 去除一些多余的点
对于一个固定的(i,a[i])坐标,要想矩形面积最大,肯定是越往左上越好
对于 b[j] < b[i] (j<i) 这样的(j,b[j])可以全部除去
除去后(i,b[i] ) 呈现单调递减
同理对(i,a[i] ) 数组操作
step3:分治:
令solve(l1,r1,l2,r2) 为 a数组在mid处取左下角,b数组在[l2,r2]中取右上角,其最优值的点为pos
这里有一个结论:
mid的对应最优点取值在pos,那么[mid+1,r1]的对应最优取值一定在[pos,r2]
证明:
只需要证明在mid+x取值时然后在[l2,pos]任意位置取值构成的矩形都小于 S(mid,pos)的取值
证明还是蛮简单的
之后我们要对三者
solve(l1,r1,l2,r2)
solve(l1,mid-1,l2,pos2)
solve(mid+1,r1,pos2,r2)
取最大值就
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)