Codeforces 607E - Cross Sum(二分答案+扫描线+计算几何)

首先考虑如何找到距离给定点第 \(m\) 大的交点。二分答案 \(mid\),以 \((x,y)\) 为圆心,\(mid\) 为半径做圆,那么如果一条直线和圆没有交点显然也不能和其他点相交,否则我们求出它和圆的两个交点的幅角 \(\theta l_i,\theta r_i\),那么两个直线在圆内相交当且仅当 \([\theta l_i,\theta r_i],[\theta l_j,\theta r_j]\) 有交,离散化+扫描线即可。

接下来考虑找到第 \(m\) 大交点以后如何求和,注意到 \(m\) 很小,所以可以直接 set 求出所有交点坐标后暴力计算。值得注意的是,圆上交点个数可能很多,因此我们需要求出圆内所有交点坐标和以及个数 \(cnt\),然后用 \((m-cnt)\times mid\) 即可算出圆上相交的交点的贡献。

时间复杂度 \(n\log V\log n+m\)

posted @ 2022-08-08 10:17  tzc_wk  阅读(43)  评论(1编辑  收藏  举报