BZOJ2640 可见区域 [计算几何+平衡树]

题目链接
题意:给定 n n n条互不相交的线段,从原点向四周看,视线遇到线段会被挡住。求此时能看到的视野范围,以及分别删除一条和两条线段后能看到最大的视野范围。
n ≤ 50 , 000 n\le 50,000 n50,000

题解

CY拉我做题啦啦啦……
考虑用循环扫描线(就是从原点开始绕360度的扫描线)。维护每个时刻所有线段对应的位置关系,也就是说所有时刻所有线段按在扫描线上到原点距离从小到大排序。由于线段互不相交,所以任意时刻相对大小不会改变。于是我们就有了加入一条线段和删除一条线段的操作,这显然可以使用平衡树维护。
一条线段都不删的情况直接在每个时刻看平衡树中最靠近原点的那条线段与两条扫描线形成三角形的面积即可。
删除一条线段时,我们考虑令 f [ i ] f[i] f[i]表示删掉线段 i i i的贡献,显然对于每个时刻,我们可以看最小线段到次小线段之间夹的面积大小,把这个贡献值加给最小线段的 f f f即可。最后 f f f取个max。
删除两条线段时,我们再令 g [ i ] [ j ] g[i][j] g[i][j]表示同时删掉 i , j i,j i,j时,每一时刻次小线段到第三小线段之间的面积贡献值。则答案就是 m a x { f [ i ] + f [ j ] + g [ i ] [ j ] } max\{f[i]+f[j]+g[i][j]\} max{f[i]+f[j]+g[i][j]} g [ i ] [ j ] ≠ 0 g[i][j]\neq 0 g[i][j]̸=0的情况只有 O ( n ) O(n) O(n)种,直接暴力枚举即可;否则直接取 f f f的最大值和次大值加起来即可。
到此为止,总复杂度 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、付费专栏及课程。

余额充值