Petrozavodsk Programming Camp, Winter 2020 部分题题解

题面这里有

Problem E. Contamination

题目大意:
平面上有\(n\)个圆,给定它们的坐标和半径。
\(q\)次询问,每次给定两个点\(p\),\(q\),给出它们的坐标以及在y轴的可移动范围\([ymin,ymax]\),问两点能否互相到达。

题解:
可以想象,如果两点无法到达,一定是\(p_x\)\(q_x\)之间有若干个圆覆盖了\([ymin,ymax]\)这一段。
由于有上下两个限制不太好做,考虑枚举第一个限制,用数据结构来维护第二个限制。
由此,我们将询问离线下来,维护一个从下到上的扫描线。
首先考虑一个圆c。当扫描线坐标\(\geq\) \(c_y\)-\(c_r\)\(\leq\) \(c_y\)+\(c_r\)时,它在\(c_x\)处将\(x\)轴一分为二。
所以我们可以以离散化后的x坐标为下标建立线段树。线段树的一个\([l,r]\)区间表示的是\(x\)坐标在\([l,r]\)之间的圆的\(y\)坐标最大值。
这样,只需要进行线段树的单点修改和区间查询了。
时间复杂度:O(nlogn)。

猜你喜欢

转载自www.cnblogs.com/Purple-wzy/p/13209206.html