专栏文章
题解: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 两种数,那么我们对一个 进行操作后会是什么样子?如果是先行后列,相当于我们对每一行按 0 的数量降序排序且把 0 放在每行最前面;如果是先列后行,相当于我们对每一列按 0 的数量降序排序且把 0 放在每行最前面。 一个 合法,肯定需要让其行和列分别构成的可重集相等,并且 的可重集和 的可重集也一定是相等的。说明我们对 进行一些行或列的交换能够得到 。我们刻画一下这个东西,相当于如果一个 合法,当且仅当存在两个排列 ,满足 。这个东西的数量就是两个可重集的排列数相乘:
现在考虑拓展。对于值域 的时候我们还是先思考如何判断合法。注意到值域很小,于是我们考虑枚举值域,设当前枚举到 ,那么我们将所有小于等于 的看成 0,否则看成 1,然后去判断 01 矩阵是否合法。如果每个 都合法那么这个矩阵合法。我们还是考虑刻画这个条件,相当于是存在一组排列 ,满足 。这个条件必要性显然,考虑充分性。就是说我们在考虑枚举值域 的时候,相当于在前面枚举 的基础上将变化的位置填上 。这样填肯定是能对应一个合法的 的。于是现在我们就去考虑满足条件的排列组数,然后去掉重复的方案数。
直接做是困难的,我们考虑将每个条件独立。现在有 ,为了让每个枚举的 独立出来,我们考虑去计数更好做的。本来我们每次的排列 是在 的基础上得到的,现在我们考虑定义一个 ,然后拿 去限制,这样就把每个 独立出来了。现在的条件就变成了 。
注意到 中 的部分是杨表,所以一个位置小于一个数的条件可以简化。设 表示 的第 行最后一个 的位置, 表示第 列最后一个 的位置。现在我们就能将前面的条件继续转化:。考虑到 递减,所以当 取最大值时限制最严,然后限制就变成了 。我们令下面那一坨等于 ,如果我们知道了 就能对 计数。
考虑 。因为 递减,所以 递减, 递增。于是 的个数就是 。考虑 。如果有 说明 中没有最大值,考虑区间内选第一个数答案是 ,后面依次少一。如果里面有最大值,考虑每个位置出现最大值是等价的,于是多乘一个 即可,因为剩下的就等价于没有最大值的填法。
对于这个东西我们就可以考虑 dp 了,设 表示前 个数, 的方案数。转移就按照上面说的做即可,注意转移的贡献与 无关,于是考虑后缀和优化一下即可。时间复杂度 。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...