计算几何之所以难学 就是因为太抽象了 不够直观 而且情况很多 很繁琐 甚至有一些东西不清不楚。。
这道题注意到题目中的描述 一个鸽子在两个点所连直线上也算。
通过看题解 发现这个地方并非直线而是线段 这不是明摆着坑人..
先考虑m<=10的做法 可以想到爆搜 然后 就利用直线 点 三角形来判断复杂度\(2^m\cdot m^3\cdot n\) 期望得分30.
其中直线判断的时候 严谨一点是 如果在直线上再判断len的大小 可是当时考试的时候发现题目中的这句话了所以就没管。
三角形 的话容易转圈叉积来判 三个叉积同方向就说明在三角形中。
code bf:
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
值得注意的是叉积的时候要开longlong. 不然痛失30分。
进一步考虑 如果是线段而不是直线的话 那么其实由暴力来看就是一些三角形 一些直线 一些点构成了答案。
这些东西其实只需要把鸽子所围成的凸包上的点都包含其实相当于包含了整体。因为这些点之间连边形成的一定也是一个凸多边形。
其实就是要求找到一个凸包包含另外一个凸包。
这个时候 考虑每一个点 然后向原凸包中发出两条切线显然切线一侧的可以是后继 然后连边。
最后跑floyd即可。最后从i到i的环的最小值就是答案了。
分析出问题的关键还是从答案的角度考虑:显然答案的点一定不在原凸包内 那只能在凸包外 此时找凸包外一点 然后寻找下一点 其实就是做切线问题了。
值得一提的是 该特判的特判好 不过没有特判一个点的情况 且是在线段的情况下的。
code sol:
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include