题意是求
max((a[j]+a[i])∗(j−i)),1≤i<j<nmax({(a[j] + a[i]) * (j - i)}), 1 \le i <j<nmax((a[j]+a[i])∗(j−i)),1≤i<j<n
可转化为求 max((a[j]−(−a[i]))∗(j−i))max({(a[j] - (-a[i])) * (j - i)})max((a[j]−(−a[i]))∗(j−i))
令b[i]=−a[i]b[i] = - a[i]b[i]=−a[i]
即变为求 max((a[j]−b[i]))∗(j−i))max({(a[j] - b[i])) * (j - i)})max((a[j]−b[i]))∗(j−i))
以 iii为横坐标,b[i]b[i]b[i]为纵坐标, 同样以jjj 为横坐标, 以 a[j]a[j]a[j]为纵坐标
即(a[j]−b[i]))∗(j−i){(a[j] - b[i])) * (j - i)}(a[j]−b[i]))∗(j−i) 为点(j,a[j])(j, a[j])(j,a[j]) 和点(i,b[i])(i, b[i] )(i,b[i]) 组成(对角线)的矩形的面积
即:
首先讨论aaa 数组
显然在左下的点是不需要的, 即若 a[j].x<a[i].x且a[j].y<a[i].ya[j].x < a[i].x 且 a[j].y < a[i].ya[j].x<a[i].x且a[j].y<a[i].y,则将会舍弃a[j]a[j]a[j]
去掉没用的点之后
aaa 数组所有点满足 若 a[j].x<a[i].xa[j].x < a[i].xa[j].x<a[i].x, 则 a[j].y>a[i].ya[j].y > a[i].ya[j].y>a[i].y, 映射到坐标系中去,aaa数组对应的点应该是这样的
再讨论bbb 数组
显然在右上的点是不需要的, 即若 a[j].x>a[i].x且a[j].y>a[i].ya[j].x > a[i].x且 a[j].y > a[i].ya[j].x>a[i].x且a[j].y>a[i].y,则将会舍弃a[j]a[j]a[j]
去掉没用的点之后
aaa 数组所有点满足 若 a[j].x>a[i].xa[j].x > a[i].xa[j].x>a[i].x, 则 a[j].y<a[i].ya[j].y < a[i].ya[j].y<a[i].y, 映射到坐标系中去,aaa数组对应的点应该是这样的(因为b数组是由a数组取反构造来的,所有所有值都在第四象限)
两个数组画出的点形状一样啊,为什么要分别讨论???
因为对于第一象限的点,横纵坐标越小大越好, 对于某一个点p,如果存在另一个点的横纵坐标都比点p大,那点p就不需要存在, 所以对于第一个可以留下 的点我们就可以存横坐标最大的点,也就是从横坐标大的往小的贪,最后留下可能有贡献的点
同理对于b的点,要从横坐标小到大贪,具体看代码
现在进入决策单调部分
结论: 当 固定a[mid]a[mid]a[mid] 点,如果b[pos]b[pos]b[pos] 是最好的点(即与a[mid]a[mid]a[mid]形成的矩形面积最大)
则:
(1)当 a[i].x<a[mid].xa[i].x < a[mid].xa[i].x<a[mid].x 时,a[i]a[i]a[i]对应的最优点b[j]b[j]b[j] 满足:b[j].x<=b[pos].xb[j].x <= b[pos].xb[j].x<=b[pos].x
(2)当 a[i].x>a[mid].xa[i].x > a[mid].xa[i].x>a[mid].x 时,a[i]a[i]a[i]对应的最优点b[j]b[j]b[j]满足:b[j].x>=b[pos].xb[j].x >= b[pos].xb[j].x>=b[pos].x
证明:
对于(1)只需要证明任意j,b[j].x>b[pos].x且b[j].x<a[i].xj, b[j].x >b[pos].x且b[j].x < a[i].xj,b[j].x>b[pos].x且b[j].x<a[i].x都有:
(a[i].y−b[pos].y)∗(a[i].x−b[pos].x)>(a[i].y−b[j].y)∗(a[i].x−b[j].x)(a[i].y - b[pos].y) * (a[i].x - b[pos].x) > (a[i].y - b[j].y) * (a[i].x - b[j].x)(a[i].y−b[pos].y)∗(a[i].x−b[pos].x)>(a[i].y−b[j].y)∗(a[i].x−b[j].x)
这只需要画个图就很明了了
对于(2)同理
那么就可以用分治来做这题了
我们对 aaa 数组和 bbb数组按横坐标进行排序
设定函数 solve(l1,r1,l2,r2)solve(l1,r1,l2,r2)solve(l1,r1,l2,r2) 求a[l1,r1]与b[l2,r2]a[l1,r1] 与 b[l2,r2]a[l1,r1]与b[l2,r2] 配对后能得出的最大面积,令mid=(l1+r1)/2mid = (l1 + r1)/2mid=(l1+r1)/2, 若 b[pos]b[pos]b[pos] 为 a[mid]a[mid]a[mid] 最优对应点
则solve(l1,r1,l2,r2)=max(solve(l1,mid,l2,pos),solve(mid+1,r1,pos,r2)solve(l1, r1, l2,r2) = max(solve(l1, mid, l2, pos), solve(mid + 1,r1, pos, r2)solve(l1,r1,l2,r2)=max(solve(l1,mid,l2,pos),solve(mid+1,r1,pos,r2)
显然该分治做法是O(nlogn)O(nlogn)O(nlogn)复杂度的