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