CF1508D 题解
First Post:
Last Update:
Last Update:
感觉稍微降智了,没有手玩清楚。
先不考虑线段不相交的限制,那么将点权归位只需在每个置换环中找一个点
此时连出的线段都以
那么我们策略就是先将所有点拼成一个大环,然后在大环上做上面的操作。
怎么拼呢?对两个不在一个环中的元素做交换可以令这两个环合并。对于这些交换,直觉告诉我们尽量用凸包上的相邻点做交换就可以避免相交。
这样的问题在于会遗漏一些点拼不成一个大环。
回顾 Graham 求凸包的过程:先找到一个最左下的基准点,然后将其他点按照与该点形成的极角排序。
事实上,排完序之后的相邻点之间的线段就不会相交了。所以在这个序列上,如果相邻点不在一个环内,就交换并合并,最后在大环上一起还原即可。