【bzoj_1185】[HNOI2007]最小矩形覆盖
咳咳。。这会来总结一下1185的解题思路(这么一道破题调了一整天我会乱说?
首先做凸包,这个谁都知道我就不说了
然后问题转化为了凸多边形的最小矩形覆盖
有一个结论是 一个凸包的最小矩形覆盖一定有矩形的一条边在凸包上
请注意是结论。。不是猜想。这个结论的正确性嘛。。wys神犇给出的解释是这样的
好吧。。
然后我们可以以逆时针的顺序枚举每条边,作为矩形的一条边所在的直线。显然,矩形与这条边平行的边一定过这条边的对踵点。这一步骤旋转卡壳就可以在均摊O(1)的时间下完成。
然后问题来了,如何在快速找到最左边、最右边的点,从而确定下这个矩形呢?O(n)的枚举比较妥妥地T ┑( ̄Д  ̄)┍
我们发现可以用类似旋转卡壳的方法来维护。
1.按照http://www.cnblogs.com/tsingyawn/p/4574936.html最后的旋转理论,我们能够发现,如果边是逆时针转动的,那么对于这条边的最左、最右点一定是逆时针转动的。(即随着线的逆时针向前走,所求也逆时针向前走)
2.然后我们发现对于所有”正“的情况来说,点按照逆时针顺序排下来的话,到极值之前与这条边的水平距离单调递增。
(请注意一定是”正"的情况。。这也是我调了一下午的原因,一直没想清楚)
其实如果从起点出发,沿逆时针方向走的话,得到的水平距离曲线一定是这样的:
注意这个小红点代表的最右边的点,x轴正方向代表的是逆时针的顺序,逆时针排名越靠后,其x坐标越大。y轴正方向表示其到那个开始点的水平距离。
然后就爽了
问题在于前面那段怎么挂掉。。最开始的时候写的是如果发现下一个点距离为负值,或者值比这个点更优就可以走下去,其实这是很错误的。。想象一下最优点后面如果跟一个负点的情况,就挂了。或者所有点都是负的,其实也会挂掉。。
然后后来改成了前面一个while循环把所有负点先走完,注意是负点,0的话是满足这个游戏的。。所以碰到大于等于零都要停下,否则所有点都是负的救死循环了
然后就真的爽了
写这个题用了一天感觉自己真的好弱啊QAQ