专栏文章

ARC204B Sort Permutation

AT_arc204_b题解参与者 3已保存评论 2

文章操作

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

当前评论
2 条
当前快照
1 份
快照标识符
@mio9bj8v
此快照首次捕获于
2025/12/02 15:28
3 个月前
此快照最后确认于
2025/12/02 15:28
3 个月前
查看原文
那我问你。
首先考虑这个最小操作次数是啥。我们将 ipii \to p_i 连一条边,形成若干个环,设环数为 rr,则为 nrn - r。每个环是独立的,方案就是每次选择一条边 uvu \to v,将 vv 从环上删掉,若原来 vwv \to w 则新的环上 uwu \to w。这样每次操作能归位一个。直到 uvu \to vvuv \to u 形成了二元环,仅需一次操作。
考虑最大化得分,即 uv(modn)u \equiv v \pmod n 的次数。我们发现环可以随意断掉一条边变成一个链,会发现这样是不会使答案减小的。假设一对点要通过这条边产生贡献,那么可以在另一边先把环缩掉,使用另一条边。于是我们拍平成一条链,把链上每个点重标号一下变成 12m1 \to 2 \to \cdots \to m,设第 ii 个点原来的标号是 aia_i。删点的形式容易考虑一个区间 DP。设 fl,rf_{l, r} 表示从 llrr 的这条链上删点,最后仅剩了 ll 的答案。转移枚举中点 midmid,有 fl,rfl,mid1+fmid,r+[alamid(modn)]f_{l, r} \gets f _ {l, mid - 1} + f _ {mid, r} + [a_l \equiv a_{mid} \pmod n]。那么 f1,mf_{1, m} 即为答案。
这样直接做复杂度是 O(n3k3)O(n ^ 3 k ^ 3) 的,无法接受。你会发现这个转移是很多余的,考虑我们的操作形如若干个会产生贡献的点对 (u1,v1),(u2,v2),(u_1, v_1), (u_2, v_2), \cdots,满足 ui<vi<ui+1<vi+1<u_i < v_i < u_{i + 1} < v_{i + 1} < \cdots,每个 [ui+1,vi1][u_i + 1, v_i - 1] 有一些东西内部消化掉,是子问题不用管它;而 [vi+1,ui+11][v_i + 1, u_{i + 1} - 1] 中间没有任何贡献,[?,vi][?, v_i] 任意向右扩展即得 [?,r][?, r],其中 r[vi+1,ui+11]r \in [v_i + 1, u_{i + 1} - 1]。于是只要不产生贡献,区间拼接就是没有必要的,由中间向两边扩展亦可。
优化转移考虑分为产生贡献和不产生贡献的两部分,前者只需 fl,rmax(fl+1,r,fl,r1)f_{l, r} \gets \max (f_{l + 1, r}, f_{l, r - 1}) 即可;后者仍然需要枚举中点 midmid,但此时我们要求 alamid(modn)a_l \equiv a_{mid} \pmod n,这样的 midmid 数量不超过 kk 个,提前存下来枚举之即可。时间复杂度降到了 O(n2k3)O(n ^ 2 k ^ 3)
这样做常数非常小,180ms 跑得飞快。至于文章开头的画面,是因为我犯【数据删除】使用了常数极大的断环成链。

评论

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

正在加载评论...