专栏文章

Solution ARC187C 1 Loop Bubble Sort

AT_arc187_c题解参与者 2已保存评论 1

文章操作

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

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

Solution ARC187C 1 Loop Bubble Sort

鲜花:这题赛后花两天时间才调出来。

题意

对于一个长度为 nn 的排列 aa,定义一次操作为依次对于 i[1,n)i\in[1,n),若 ai>ai+1a_i>a_{i+1} 则 swap 它们(即对于序列 aa 执行单次冒泡排序的操作)。
现在给你一个序列 ansans,其中钦定了一些位置。你要求出有多少个排列 aa 使得对 aa 进行单次操作后满足 aaansans 在钦定的这些位置相等。
先分析题目所说的单次冒泡排序的操作。我们发现假设处理到 aia_i,其会跟随 swap 操作一直往后移到第一个大于 aia_i 的位置前。即将 aa 划分成若干个段,每个段的最大值均为这个段的第一个数,且每一段的第一个数依次递增。然后对于每个段循环向左移位。如下图:
考虑知道了 ansans 如何倒着推出 aa,此时变成了选出一些段,每个段的最大值必须在其末尾,且若从左往右对段编号,编号小的段的最大值小于编号大的段。每种划分 ansans 的方案数都对应着一种合法的 aa,我们只需对前者计数即可。
此时我们发现就变成了较为经典的 dp 形式,记 fi,jf_{i,j} 表示钦定 ii 是当前段的最后一个元素,且值为 jj 的方案数。那么它可以从 fk,l (0k<i,0l<j)f_{k,l}\ (0\le k<i,0\le l<j) 转移过来,表示选了 (k,i](k,i] 这个段。
考虑朴素的 dp 方式,记 sumisum_i 表示值域[1,i][1,i] 内被钦定的数的个数,cnticnt_i 表示下标[1,i][1,i]未被钦定的个数
式子略繁杂但是不难推,建议自己先去推一下。这里直接给出:
fi,j=k=0i1l=0j1fk,l(jsumj[ansij]cntk)!(jsumjcnti)!f_{i,j}=\sum_{k=0}^{i-1}\sum_{l=0}^{j-1}f_{k,l}\frac{(j-sum_j-[ans_i\neq j]-cnt_k)!}{(j-sum_j-cnt_i)!}
后面的代表乘上的排列数,[ansij][ans_i\neq j] 意思是如果最后一个是 1-1 那么其值必须为 jj,直接钦定了。
然后需要判掉 fi,jf_{i,j} 不合法的情况,细节较多。
考虑优化。首先发现 ll 这维后面乘上的系数都一样,所以前缀和一下,记 gkg_k 表示当前的 fk,l\sum f_{k,l},此时时间复杂度变成了 O(n3)O(n^3)
然后发现优化后的式子调换 i,ji,j 的枚举顺序,仍然可以前缀和。fi,jf_{i,j} 涉及到的 gg 的下标是一个区间,因为需要满足 (k,i](k,i] 这个区间的最大值不能超过 jj 所以 kk 不能过小。这个伴随 ii 的增大是具有单调性的,所以可以双指针。
时间复杂度 O(n2)O(n^2)code

评论

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

正在加载评论...