CF1508D 题解

First Post:

Last Update:

感觉稍微降智了,没有手玩清楚。

先不考虑线段不相交的限制,那么将点权归位只需在每个置换环中找一个点 ,然后不断交换 的值 ,这样一次操作就会让环的大小减少 ,最后就归位了。

此时连出的线段都以 为端点,它们自然不会相交,无论一个置换环的点在平面上的形态如何。(我当时以为凹多边形不能这么换,就自闭在这了)

那么我们策略就是先将所有点拼成一个大环,然后在大环上做上面的操作。

怎么拼呢?对两个不在一个环中的元素做交换可以令这两个环合并。对于这些交换,直觉告诉我们尽量用凸包上的相邻点做交换就可以避免相交。

这样的问题在于会遗漏一些点拼不成一个大环。

回顾 Graham 求凸包的过程:先找到一个最左下的基准点,然后将其他点按照与该点形成的极角排序。

事实上,排完序之后的相邻点之间的线段就不会相交了。所以在这个序列上,如果相邻点不在一个环内,就交换并合并,最后在大环上一起还原即可。