专栏文章

题解:AT_arc204_b [ARC204B] Sort Permutation

AT_arc204_b题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio2r0f1
此快照首次捕获于
2025/12/02 12:24
3 个月前
此快照最后确认于
2025/12/02 12:24
3 个月前
查看原文

题解:AT_arc204_b [ARC204B] Sort Permutation

题目大意:给你一个长度为 nknk 的排列 p=(p1,p2,...,pnk)p=(p_1,p_2,...,p_{nk}),想要通过若干次交换任意两个元素使它变成 (1,2,...,nk)(1,2,...,nk),在最小化操作次数的前提下,最大化操作中选择的两个下标的距离是 nn 的倍数的操作次数。
考虑建图,iipip_i 连边表示 ii 位置的元素想要到 pip_i 那里,形成的图由若干个环组成,显然要使得操作次数最小,对一个环的操作次数应当是环的大小 1-1
考虑对一个环进行一个操作。为了让操作次数最小,每次操作必须让一个元素归位。因此一定是操作环上相邻的两个点,记顺时针方向靠前的点为 uu,下一个是 vv,交换后 uu 归位,vvuu 的位置上,相当于删除 vvvv 原本的位置不再有用,而 uu 的位置上的 vv 指向原本 vv 的下一个点),其距离显然是 uuvv 对应位置的距离。我们称 vvuu 淘汰。
考虑每个点与被它淘汰的点的关系,不难发现可以形成一棵树,每个点向所有被它淘汰的点连边,而这棵树的前序遍历正是这个环从某个点断开形成的一条链。由于甲被乙淘汰和乙被甲淘汰产生的贡献一致,所以可以任意钦定根节点。我们随便找一个位置断开环,原问题就转换成找出以它为前序遍历的树对答案产生的贡献最大是多少。
考虑区间 dp,状态 fi,jf_{i,j} 表示考虑链上的区间 [i,j][i,j],变成一棵子树的最优贡献。但是由于不知道有几棵子树,转移会很慢。考虑 ii 即子树的根,它的所有儿子中,找出第一个 sonson 会对答案产生贡献的,把前面的除了第一个之外都变成第一个的儿子,形成 ii 的第一个儿子显然不会使答案更差,而 sonson 作为第二个儿子,把其右侧兄弟都作为其子节点,显然也不会影响答案,但是儿子只剩两个。
现在考虑转移,若只有一个儿子,则用 fi+1,jf_{i+1,j} 更新,否则枚举与 ii 同余的作为第二个儿子,用 fi+1,mid1+fmid,j+1f_{i+1,mid-1}+f_{mid,j}+1 更新。
时间复杂度 O(n2k3)O(n^2k^3),可以通过。

评论

0 条评论,欢迎与作者交流。

正在加载评论...