提示1
至少需要几条直线可以构成一个封闭图形?
提示2
如果存在一组平行线和另一组斜率不同的平行线会是什么情况?
题目解析
提示1:最少 333 条斜率不同且没有相交于同一点的直线可以构成一个封闭图形。
提示2:如果存在一组平行线和另一组斜率不同的平行线,那么必然可以构成一个封闭图形。
根据 提示2 我们将题目分成两种情况。
A. 存在一组平行线和另一组斜率不同的平行线。
B. 不存在一组平行线和另一组斜率不同的平行线。
对于 情况A,我们可以将所有斜率相同的直线的截距 bbb 放到一个集合中,令斜率为 kik_iki 但截距不同的直线数量为 cntkicnt_{k_i}cntki 。
若存在 cntki>1,cntkj>1(ki≠kj)cnt_{k_i} > 1, cnt_{k_j} > 1(k_i \neq k_j)cntki >1,cntkj >1(ki =kj ) 则必然存在封闭区域。
对于 情况B,此时所有的直线中至多有一个斜率 kik_iki 中截距不同的直线数量 cntki>1cnt_{k_i} > 1cntki >1, 对于其他斜率 cntkj=1,(kj≠ki)cnt_{k_j} = 1, (k_j \neq k_i)cntkj =1,(kj =ki )。
那么对于 情况B 我们只需要考虑 提示1 的情况:333 条斜率不同且没有相交于同一点的直线可以构成一个封闭图形即可。
对此我们可以枚举直线 iii,然后枚举直线 j,(ki≠kj)j, (k_i \neq k_j)j,(ki =kj ),若存在两条直线 ja,jb(kja≠kjb)j_a, j_b (k_{j_a} \neq k_{j_b})ja ,jb (kja =kjb ) 和直线 iii 相交与不同的两点,则说明可以构成封闭图形。
在实现上,情况B 留给我们的特殊性质,使得我们可以通过枚举斜率 kik_iki 的方式得到更低的复杂度(思考下为什么)。
AC代码
复杂度分析
对斜率相同的直线集合去重时间复杂度为 O(∣k∣log∣b∣)O(\left|k\right|\log{\left|b\right|})O(∣k∣log∣b∣)。
若为 情况A,此时便可直接得到答案。
若为 情况B,枚举直线时间复杂度为 O(n2)O(n^2)O(n2),枚举斜率的时间复杂度为 O(n⋅∣k∣)O(n \cdot \left|k\right|)O(n⋅∣k∣)(思考下为什么)。