题解:P12543 [APIO2025] 转杆

前言

详细解密为什么我过 T3 没有 Ag。

思路分析

首先这个题面太唬人了,但是读完发现和计算几何啥的没关系。

考虑末态,不难发现是线段两两配对垂直,此时答案是 \(25000(\lfloor\frac{n}{2}\rfloor)^2\)

于是考虑构造合法操作方案使得答案不降。

有一个想法是,以和 \(x\) 轴角度最小的直线为新的 \(x\) 轴建立坐标系,然后依次旋转直线使得所有直线和坐标轴平行,最后再调整使得和 \(x\) 轴平行和 \(y\) 轴平行的直线数的差小于等于 \(1\)

然后考虑什么时候直线可以被旋转至和坐标轴平行。

我们建立新的坐标轴之后,图上的直线可以分为四类,如图所示:

考虑什么时候可以旋转什么样的直线:

  • \(a+c>b+d\),旋转 \(a\) 中最靠近 \(d\) 的直线至 \(d\)

  • \(a+c<b+d\),旋转 \(b\) 中最靠近 \(c\) 的直线至 \(c\)

  • \(a+d>b+c\),旋转 \(a\) 中最靠近 \(c\) 的直线至 \(c\)

  • \(a+d<b+c\),旋转 \(b\) 中最靠近 \(d\) 的直线至 \(d\)

因为每次都是 \(a,b\) 移动到 \(c,d\),所以移动会在有限次内结束。

无法移动的情况可能有两种:

  • \(a=b\)\(c=d\)

  • 满足不等式但是 \(a=0\)\(b=0\)

仔细思考后发现第二种是不可能的,此时除非 \(a=b=0\),不然一定存在满足条件的移动方式。

于是我们只需要考虑第一种情况的处理,因为此时满足 \(c=d\),相当于之前移动的直线已经两两配对,我们只需要把剩下 \(a,b\) 中的直线两两配对即可。这个部分是简单的,仔细手玩之后发现只需要把 \(a\) 中最靠近 \(d\) 的直线和 \(b\) 中最靠近 \(c\) 的直线配对即可,依次进行,判断谁去向谁垂直,就能做到每次移动直线都不相交。

如果没有出现第一种情况,那么一定能移动至 \(a=b=0\) 的末态,此时我们再调整 \(c,d\) 的值使得 \(|c-d|\le 1\) 即可。

使用 set 维护直线斜率,复杂度 \(O(n \log n)\),操作次数在 \(1.5n\) 以内。

后记

这个做法其实属于比较麻烦的那种,所以场上我刚了 4h 才刚出来,导致 T1 T2 暴力基本没打,Cu 遗憾离场。

有无老哥帮我复现一下代码。

posted @ 2025-05-19 21:22  _Kenma  阅读(86)  评论(2)    收藏  举报