专栏文章

题解:AT_agc057_e [AGC057E] RowCol/ColRow Sort

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

文章操作

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

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

题解

困难题,花费大量时间才会。
注意到值域很小,我们考虑从此入手。假设现在只有 01 两种数,那么我们对一个 AA 进行操作后会是什么样子?如果是先行后列,相当于我们对每一行按 0 的数量降序排序且把 0 放在每行最前面;如果是先列后行,相当于我们对每一列按 0 的数量降序排序且把 0 放在每行最前面。 一个 AA 合法,肯定需要让其行和列分别构成的可重集相等,并且 AA 的可重集和 BB 的可重集也一定是相等的。说明我们对 BB 进行一些行或列的交换能够得到 AA。我们刻画一下这个东西,相当于如果一个 AA 合法,当且仅当存在两个排列 p,qp,q,满足 i,j,Ai,j=Bpi,qj\forall i,j,A_{i,j}=B_{p_i,q_j}。这个东西的数量就是两个可重集的排列数相乘:
n!m!(j=1m(i=1n[ai=j])!)(i=1n(j=1m[bj=i])!)n!m!\over \left(\prod\limits_{j=1}^m\left(\sum\limits_{i=1}^n[a_i=j]\right)!\right)\left(\prod\limits_{i=1}^n\left(\sum\limits_{j=1}^m[b_j=i]\right)!\right)
现在考虑拓展。对于值域 [0,9][0,9] 的时候我们还是先思考如何判断合法。注意到值域很小,于是我们考虑枚举值域,设当前枚举到 ii,那么我们将所有小于等于 ii 的看成 0,否则看成 1,然后去判断 01 矩阵是否合法。如果每个 ii 都合法那么这个矩阵合法。我们还是考虑刻画这个条件,相当于是存在一组排列 (p0,q0,p1,q1,,p9,q9)(p_0,q_0,p_1,q_1,\dots,p_9,q_9),满足 [Ai,jk]=i,j,k,[Bpk,i,qk,jk][A_{i,j}\le k]=\forall i,j,k,[B_{p_{k,i},q_{k,j}}\le k]。这个条件必要性显然,考虑充分性。就是说我们在考虑枚举值域 ii 的时候,相当于在前面枚举 i1i-1 的基础上将变化的位置填上 ii。这样填肯定是能对应一个合法的 AA 的。于是现在我们就去考虑满足条件的排列组数,然后去掉重复的方案数。
直接做是困难的,我们考虑将每个条件独立。现在有 Bpk,i,qk,jkBpk+1,i,qk+1,jk+1B_{p_{k,i},q_{k,j}}\le k\rightarrow B_{p_{k+1,i},q_{k+1,j}}\le k+1,为了让每个枚举的 kk 独立出来,我们考虑去计数更好做的。本来我们每次的排列 (pk,qk)(p_k,q_k) 是在 (pk1,qk1)(p_{k-1},q_{k-1}) 的基础上得到的,现在我们考虑定义一个 pk=pkpk1p'_k={p_k\over p_{k-1}},然后拿 pkp'_k 去限制,这样就把每个 kk 独立出来了。现在的条件就变成了 Bi,jkBpk,i,qk,jk+1B_{i,j}\le k\rightarrow B_{p'_{k,i},q'_{k,j}}\le k+1
注意到 BBk\le k 的部分是杨表,所以一个位置小于一个数的条件可以简化。设 aia_i 表示 BB 的第 ii 行最后一个 k\le k 的位置,bjb_j 表示第 jj 列最后一个 k\le k 的位置。现在我们就能将前面的条件继续转化:jai,pibqj\forall j\le a_i,p'_i\le b_{q'_j}。考虑到 bb 递减,所以当 qjq'_j 取最大值时限制最严,然后限制就变成了 pibmaxj=1aiqjp'_i\le b_{\max\limits_{j=1}^{a_i}q'_j}。我们令下面那一坨等于 cic_i,如果我们知道了 cic_i 就能对 p,qp',q' 计数。
考虑 pp'。因为 aia_i 递减,所以 cic_i 递减,bcib_{c_i} 递增。于是 pp' 的个数就是 i=1nbcii+1\prod\limits_{i=1}^nb_{c_i}-i+1。考虑 qq'。如果有 ci=ci1c_i=c_{i-1} 说明 (ai,ai1](a_{i},a_{i-1}] 中没有最大值,考虑区间内选第一个数答案是 ci1(ai1)=ciaic_i-1-(a_i-1)=c_i-a_i,后面依次少一。如果里面有最大值,考虑每个位置出现最大值是等价的,于是多乘一个 ai1aia_{i-1}-a_i 即可,因为剩下的就等价于没有最大值的填法。
对于这个东西我们就可以考虑 dp 了,设 fi,jf_{i,j} 表示前 ii 个数,ci=jc_i=j 的方案数。转移就按照上面说的做即可,注意转移的贡献与 jj 无关,于是考虑后缀和优化一下即可。时间复杂度 O(nmV)\mathcal O(nmV)

评论

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

正在加载评论...