jzoj 3956. 【GDOI2015模拟12.20】鸡腿の梦境

这题因为有多种解法(传说中的好题,所以写写题解)
我们应该有很多种方法来做的

我们可以转化一下模型。
然后回来再看,发现可以将每个破船的半径增大鸡腿飞船半径。
然后我们就可以将题目转化为一个点判断飞船是否可以围成一个圈,使其包住鸡腿飞船的坐标。

\(solution 1\)

\(O(n^3)\)
我们以鸡腿飞船为中心建立坐标系。
然后对于\(y\)轴左边和右边的点分开。
我们做两遍\(floyd\),分别看看能否从原点上面过和下面过。
然后我们对于左右两边的两个点,看看是否上下都连通即可。

\(solution 2\)

\(O(n^2)\)
我们还可以更骚地去做。
我们仍以鸡腿飞船为中心建立坐标系。
然后对于其左边的和右边的分开,求出各自区域能连通的那些连通块并用并查集来存。
接着我们可以\(O(n^2)\)判断一下两个不同区域的点之间能否走到,若能则将两个连通块之间打标记(标记要分清是从原点上面走还是下面走)。
若上下都能走到则为\(NO\)
感觉这个方法要更优一些。

\(solution 3\)

有个很奇异的解法。
我们求出所有的最大凸包。
然后任意选\(5\)~\(10\)个点(位置随意),判断它与飞船点的连线与凸包的交点个数,若都为奇数则\(YES\),反之为\(NO\)

猜你喜欢

转载自www.cnblogs.com/jz929/p/12176850.html