ABC250F
ABC250F
*2044
题意
给你一个凸包,你需要沿着对角线将其 击而破之 切成两部分,然后选择其中的一部分。设原凸包的面积是 \(A\),你选择的部分是 \(B\) ,你需要最小化 \(8 × |A \div4-B|\)。可以证明答案是一个整数。
凸包以顶点的形式给出,顶点按逆时针方向排列。
\(N \le 10^5\)
题解
直接运用旋转卡壳的思想,使用双指针。
枚举每一个起刀点 \(p\),然后逆时针枚举落刀点 \(q\) ,始终选取所切出的线段的左半平面。容易发现这样所得到的面积 \(B\) 是随着 \(q\) 的移动单调递增的。而当其超过了 \(A ÷ 4\) 时显然接着枚举不会更新答案了,所以就可以只计算第一个大于 \(A÷4\) 的 \(q\)(注意这里没必要移动 \(q\) 了),然后跳过剩下的点。
那么当我们接着逆时针枚举 \(p+1\) 的时候,我们就没必要重置之前的 \(q\) 了。因为在固定 \(q\) 的情况下,\(p ← p+1\) 只会使得面积变小,不会超过 \(A ÷ 4\),省去了前面的点,从而避免了重复枚举。然后接着向后枚举 \(q\) 即可。
时间复杂度 \(O(n)\) 。