CF1474E What Is It?
p并不给你,有反问题的感觉。
假设对于固定的排列p,最坏时间怎么算?
先理解一下,为什么最多不超过n次操作。
pi指向的数值,变为位置,然后交换i和这个位置j
从一个位置,得到另一位置的信息。
感觉是置换环上的边。
一次操作其实就是把置换环上的边——
再次错过
再再次错过
只要自己不够愚蠢,如果自己蠢一点,就可以不需要顾虑那么多,直接做。
一次操作其实就是把置换环上的边,比如有x -> y -> z
x->y 表示p[x]=y
那么我们对x->y这条边进行操作,swap(p[x],p[y]),就就是让p[y]=y,且p[x]=z
也就是把置换环上的一点取下来成为归位点,然后连边新形成的邻点。
那么,所有置换环的边数之和<=n,因此最多n次一定可以全体归位。
现在,每次操作要付出代价,可以写在边权上。
哦不,我们不仅仅删边,还得连新的边。
就一个环来说——我们可以把所有环分别单独处理,互不影响——,猜一个贪心算法(如果是DP的话,恐怕推广到反问题上就更麻烦了):
把初始边按照权值来从小到大排序,这就是我们删除的顺序。
代价是平方,那么调整法就非常可能。
一个规律:首先,取一个点作为环的取点开始标记序号,对于序号j,如果它是通过边(i,j)删除的,那么对于所有k=i+1,...,j-1,k都应该通过(i,k)删除,
否则我们可以通过调整来——
嗯?我突然想起了,这似乎有点类似卡特兰类型的区间划分。(合并石子?)
如果j是通过i<j的(i,j)删除的,那么内部的点k,也必然是从内部的点删除的,这个区间,独立了。
然后我们可以枚举最后一个中间点 i k j,这样就再次划分,像合并石子,但我期待这次不需要DP。

浙公网安备 33010602011771号