Atcoder abc317
https://atcoder.jp/contests/abc317
G - Rearranging
n x m 矩阵,一共含有 1..n 都有m个
n,m \in [1,100]
对于每一行,行内可以随意重排列
问是否有办法让每一列都是 1..n 各出现一次, 如果有给出方案
2s
1024mb
我的思路
第一直觉是一定有方法
想法是每次确定一列
每次找单行中出现次数最多的减去1,
然后 剩余行中未被选择的最多的减去1
如果这个方案是可行的,那么就能变成 列数规模减1的 同样子问题
所以需要证明 一定可行,或者找到反例
1 | 11144 |
是一个反例,这样会先选1,2,3 就无法选到4了, 但同时它也有方案
1 | 11144 |
另一个想法是 从值看,如果一个值占满了一行,那么这个值就不需要考虑如何分配了,变成行-=1的子问题
如果 一个值未占满一行,那么至少有2行有它
然后(一行,值)选不选,作为状态 似乎能构成2-sat问题
如果能证明这个2-sat问题一定有解,那么原问题就有解,如果证明不了,那当无解时,并不能证明不能递归下降就是无解
感觉需要智力来完成构造?但我没有智力
题解
左边n个点表示行,右边n个点表示值
每个 i->a[i,j]
形成边,可以重边
这样进行一次完美匹配,则对应了一次选列
证明总存在答案
直接 hall定理
首先选颜色数 连的行数 总是 $\ge$颜色数,因为有颜色数 * m(每个颜色个数)
个值, 至少要 颜色数 * m(每个颜色个数)/ m(列数)
行来放,
所以总有 完美匹配的方案,那么去掉完美匹配方案就是子问题
那么如何找完美匹配 就是简单的二分图最大匹配算法了
代码
https://atcoder.jp/contests/abc317/submissions/49622324
1 |
|
Ex - Walk
n点有向图,无重边,但可能自环
然后对于任意边 $s\to t$, 要么$t=1$, 要么点的下标$t-s\in[0,2]$
问有多少种方案 从1开始,到n结束,恰好k次, mod 998244353
n 5e4
k 5e5
8s
1024mb
我的思路
首先所有边都是前进边没有回边
所以到任何点至多使用了一次从1的距离跳跃,剩下的就是 自环/+1/+2
dp[i][step] = dp[1][step-1]+dp[i][step-1]+ dp[i-1][step-1] + dp[i-2][step-2]
,
然后每个加项还要乘上 它们对应的边是否存在
注意没有重边对于i=2,=3稍微处理一下
这样的做法是O(nk)
的 显然mle+tle
然后想的就是生成函数
$f_i(x) = \sum_{j} A_{i,j} x^j$
$f_i = a_i\cdot f_ix+d_i\cdot f_1x+b_{i-1}\cdot f_{i-1}x+c_{i-2}\cdot f_{i-2}x$
这让我想到了 矩阵乘法
$[f_i,f_{i-1},f_1] \to [f_{i+1},f_{i},f_1]$, 对于自环, 就是分母乘上$(1-a_ix)$,
1 | b[i-1]x 1 0 |
然后因为矩阵乘法的结合率,可以就是二分/分治,这样每次的最高x次方不超过倍长度
读错题了,艹艹艹艹艹艹艹艹艹艹艹艹艹艹,d[i]是n->1
不是1->n
那就相对麻烦了,有回边
不过也好,因为所有的环都经过1,所以需要计算 1...[not 1]...1
的 长度 => 个数
这样 矩阵 改动一下
1 | [f_i,f_i,sum 首位是1中间非1的环] |
$f_i = a_i\cdot f_ix+b_{i-1}\cdot f_{i-1}x+c_{i-2}\cdot f_{i-2}x$ 只计算无环的情况
1 | b[i-1]x/(1-a[i]x) 1 d[i]x b[i-1]x/(1-a[i]x) |
这样 分母单独算,似乎就过了?
代码
还真过了
https://atcoder.jp/contests/abc317/submissions/49627904
1 |
|
参考
https://atcoder.jp/contests/abc317/editorial
总结
316 不知道为啥消失了
G: 感觉上是觉得总有解,但想不出如何证明, 转化成二分图匹配也没想到, hall’s theorem遇到过2次
不过好久都没有写最大流的题目了
Ex: 虽然写了很久,但自己写出了3426铜牌题,