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

这篇博客探讨了一种优化算法,通过转化原问题为寻找最大矩形面积,采用分治策略进行求解。作者首先讨论了如何通过变换数组消除无效的点,然后证明了在固定一个点的情况下,如何确定最佳匹配点以最大化面积。最终,提出了一个O(nlogn)复杂度的解决方案,涉及数组排序和递归的分治过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
题意是求
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])(ji)),1i<j<n
可转化为求 max((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]
即变为求 max((a[j]−b[i]))∗(j−i))max({(a[j] - b[i])) * (j - i)})max((a[j]b[i]))(ji))
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]))(ji) 为点(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].xa[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].xa[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].xb[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].yb[pos].y)(a[i].xb[pos].x)>(a[i].yb[j].y)(a[i].xb[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)复杂度的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值