杂题
连通块 -Gym 105170D
通过性质搞随机化+利用记录直线离y轴最近整点的tirck
题意:给定了平面上的一些点和平行线的个数,输出一种方案使得所有点都在这 \(k(k \le 50)\) 条不重复的平行线上且每一条平行线上至少有两个点。
对于一个给定的斜率,我们可以用 map
在 \(O(n\log n)\) 时间复杂度下完成一次 check。
关于用 map
记录两点是否在一条直线上:我们可以去计算截距,但是精度的处理很麻烦。给定了表示斜率的互质对 \((dx,dy)\),我们不妨求出经过当前计算的点 \((x,y)\) 所在直线离 \(y\) 轴最近的那个点。\(cnt = x / dx,x = x - cnt * dx, y = y - cnt * dy\)。对于所有在这条直线上的点一定会是这个值,因为 \(dx,dy\) 的互质保证了 \(x_1 \% dx = x_2 \% dx\)。
但是这会超时(虽然OJ 上可以过)。考虑随机两个点,可以证明随机出合法的最小概率为 \(\frac{1}{k}\),那么随机 \(k\) 次即可。
证明:总共的点对个数为 \(n \times (n - 1)\),最坏情况下,所有点平均分布在 k 条直线上,平均一条直线有 \(\frac{n}{k}\) 个点。
那么枚举到这条线上的两个点的点对个数为 \(k \times (\frac{n}{k} \times (\frac{n}{k}-1))\)。
那么概率就是:\[P = \frac{k \times (\frac{n}{k} \times (\frac{n}{k}-1))}{n \times (n - 1)} \\ = \frac{\frac{n^2}{k}-n}{n ^2 - n} \\ = \frac{n^2-n\times k}{n ^2 \times k- n\times k} ≈ \frac{1}{k}\\ \]