CF603D Ruminations on Ruminants
给定n条直线,两两不平行,且任意三条直线不经过同一个点,然后求解满足原点在外接圆上的由三条直线围成的三角形有多少个。
首先这道题只需要知道Simson theorem就可以做了。
定理内容是三角形外接圆上的点到三角形三边的射影共线。
逆定理是满足到三角形三边射影共线的点在三角形外接圆上。
那么我们只需要求解出原点到每条直线的垂足,然后枚举一个点,计算出这个点到后面所有点的斜率,然后相同斜率的就可以产生贡献,相当于统计平面内三点共线的对数,我们可以通过枚举+排序做到O(n2)O(n^2)O(n2)
这里有个技巧,就是斜率不存在的点我们将它们的斜率设为INF。
另外还需要特判一下垂足重合的情况,只会出现在直线经过原点的情况,其他时候垂足一定直线就是一定的。