题目大意:给你一个长度为 nk 的排列 p=(p_1,p_2,...,p_{nk}),想要通过若干次交换任意两个元素使它变成 (1,2,...,nk),在最小化操作次数的前提下,最大化操作中选择的两个下标的距离是 n 的倍数的操作次数。
考虑建图,i 向 p_i 连边表示 i 位置的元素想要到 p_i 那里,形成的图由若干个环组成,显然要使得操作次数最小,对一个环的操作次数应当是环的大小 -1。
考虑对一个环进行一个操作。为了让操作次数最小,每次操作必须让一个元素归位。因此一定是操作环上相邻的两个点,记顺时针方向靠前的点为 u,下一个是 v,交换后 u 归位,v 到 u 的位置上,相当于删除 v(v 原本的位置不再有用,而 u 的位置上的 v 指向原本 v 的下一个点),其距离显然是 u 和 v 对应位置的距离。我们称 v 被 u 淘汰。
考虑区间 dp,状态 f_{i,j} 表示考虑链上的区间 [i,j],变成一棵子树的最优贡献。但是由于不知道有几棵子树,转移会很慢。考虑 i 即子树的根,它的所有儿子中,找出第一个 son 会对答案产生贡献的,把前面的除了第一个之外都变成第一个的儿子,形成 i 的第一个儿子显然不会使答案更差,而 son 作为第二个儿子,把其右侧兄弟都作为其子节点,显然也不会影响答案,但是儿子只剩两个。
现在考虑转移,若只有一个儿子,则用 f_{i+1,j} 更新,否则枚举与 i 同余的作为第二个儿子,用 f_{i+1,mid-1}+f_{mid,j}+1 更新。