Two Buildings(决策单调性+分治)

在这里插入图片描述
题意是求
m a x ( ( a [ j ] + a [ i ] ) ∗ ( j − i ) ) , 1 ≤ i < j < n max({(a[j] + a[i]) * (j - i)}), 1 \le i <j<n max((a[j]+a[i])(ji)),1i<j<n
可转化为求 m a x ( ( a [ j ] − ( − a [ i ] ) ) ∗ ( j − i ) ) max({(a[j] - (-a[i])) * (j - i)}) max((a[j](a[i]))(ji))
b [ i ] = − a [ i ] b[i] = - a[i] b[i]=a[i]
即变为求 m a x ( ( a [ j ] − b [ i ] ) ) ∗ ( j − i ) ) max({(a[j] - b[i])) * (j - i)}) max((a[j]b[i]))(ji))
i i i为横坐标, b [ i ] b[i] b[i]为纵坐标, 同样以 j j j 为横坐标, 以 a [ j ] a[j] a[j]为纵坐标
( a [ j ] − b [ i ] ) ) ∗ ( j − i ) {(a[j] - b[i])) * (j - i)} (a[j]b[i]))(ji) 为点 ( j , a [ j ] ) (j, a[j]) j,a[j] 和点 ( i , b [ i ] ) (i, b[i] ) (i,b[i]) 组成(对角线)的矩形的面积
即:
在这里插入图片描述

首先讨论 a a a 数组

显然在左下的点是不需要的, 即若 a [ j ] . x < a [ i ] . x 且 a [ j ] . y < a [ i ] . y a[j].x < a[i].x 且 a[j].y < a[i].y a[j].x<a[i].xa[j].y<a[i].y,则将会舍弃 a [ j ] a[j] a[j]
去掉没用的点之后
a a a 数组所有点满足 若 a [ j ] . x < a [ i ] . x a[j].x < a[i].x a[j].x<a[i].x, 则 a [ j ] . y > a [ i ] . y a[j].y > a[i].y a[j].y>a[i].y, 映射到坐标系中去, a a a数组对应的点应该是这样的

在这里插入图片描述
再讨论 b b b 数组

显然在右上的点是不需要的, 即若 a [ j ] . x > a [ i ] . x 且 a [ j ] . y > a [ i ] . y a[j].x > a[i].x且 a[j].y > a[i].y a[j].x>a[i].xa[j].y>a[i].y,则将会舍弃 a [ j ] a[j] a[j]
去掉没用的点之后
a a a 数组所有点满足 若 a [ j ] . x > a [ i ] . x a[j].x > a[i].x a[j].x>a[i].x, 则 a [ j ] . y < a [ i ] . y a[j].y < a[i].y a[j].y<a[i].y, 映射到坐标系中去, a a a数组对应的点应该是这样的(因为b数组是由a数组取反构造来的,所有所有值都在第四象限)
在这里插入图片描述
两个数组画出的点形状一样啊,为什么要分别讨论???
因为对于第一象限的点,横纵坐标越小大越好, 对于某一个点p,如果存在另一个点的横纵坐标都比点p大,那点p就不需要存在, 所以对于第一个可以留下 的点我们就可以存横坐标最大的点,也就是从横坐标大的往小的贪,最后留下可能有贡献的点
同理对于b的点,要从横坐标小到大贪,具体看代码

现在进入决策单调部分
结论: 当 固定 a [ m i d ] a[mid] a[mid] 点,如果 b [ p o s ] b[pos] b[pos] 是最好的点(即与 a [ m i d ] a[mid] a[mid]形成的矩形面积最大)
则:
(1)当 a [ i ] . x < a [ m i d ] . x a[i].x < a[mid].x a[i].x<a[mid].x 时, a [ i ] a[i] a[i]对应的最优点 b [ j ] b[j] b[j] 满足: b [ j ] . x < = b [ p o s ] . x b[j].x <= b[pos].x b[j].x<=b[pos].x
(2)当 a [ i ] . x > a [ m i d ] . x a[i].x > a[mid].x a[i].x>a[mid].x 时, a [ i ] a[i] a[i]对应的最优点 b [ j ] b[j] b[j]满足: b [ j ] . x > = b [ p o s ] . x b[j].x >= b[pos].x b[j].x>=b[pos].x
证明:
对于(1)只需要证明任意 j , b [ j ] . x > b [ p o s ] . x 且 b [ j ] . x < a [ i ] . x j, b[j].x >b[pos].x且b[j].x < a[i].x j,b[j].x>b[pos].xb[j].x<a[i].x都有:
( a [ i ] . y − b [ p o s ] . y ) ∗ ( a [ i ] . x − b [ p o s ] . 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].yb[pos].y)(a[i].xb[pos].x)>(a[i].yb[j].y)(a[i].xb[j].x)
这只需要画个图就很明了了
在这里插入图片描述
对于(2)同理
在这里插入图片描述
那么就可以用分治来做这题了
我们对 a a a 数组和 b b b数组按横坐标进行排序
设定函数 s o l v e ( l 1 , r 1 , l 2 , r 2 ) solve(l1,r1,l2,r2) solve(l1,r1,l2,r2) a [ l 1 , r 1 ] 与 b [ l 2 , r 2 ] a[l1,r1] 与 b[l2,r2] a[l1,r1]b[l2,r2] 配对后能得出的最大面积,令 m i d = ( l 1 + r 1 ) / 2 mid = (l1 + r1)/2 mid=(l1+r1)/2, 若 b [ p o s ] b[pos] b[pos] a [ m i d ] a[mid] a[mid] 最优对应点
s o l v e ( l 1 , r 1 , l 2 , r 2 ) = m a x ( s o l v e ( l 1 , m i d , l 2 , p o s ) , s o l v e ( m i d + 1 , r 1 , p o s , r 2 ) 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 ( n l o g n ) O(nlogn) O(nlogn)复杂度的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值