日记
不是我中邪了啊 10 分的暴力都能挂?
对于 ai 和 pi 的奇偶性不同的,我们先把 ai 加上 1。把 s 减掉 1,表示方案需要在 (s,t] 这段区间内。再把 s 和 t 都减掉 ∑i=1nai,表示先都取一个 ai。这时如果 s<0 就把 s 赋值成 −1,t<0 就无解直接结束。
而我们又发现剩下的一定是两个两个取的,于是我们可以把 s←⌊2s⌋,t←⌊2t⌋,再有 ci=⌊2bi−ai⌋(这个 ai 是和 pi 奇偶性相同的 ai)。问题就变成了每个点都取不超过 ci 个数,使得总和在 (s,t] 这个区间内的方案数。
我们可以求出总和小于等于 s 的方案数 calc(s) 和总和小于等于 t 的方案数 calc(t)。那么最终的答案就是 calc(t)−calc(s)。
考虑如何求 calc(x)。我们可以容斥。枚举二进制状态 s,表示钦定 s 集合内的点超限了。那么剩下的点就是 x−∑i∈s(ci+1)。而我们要把这么多数分给 n+1(n+1 的原因是我们求的是小于等于的,不要的我们就扔给 n+1)个点,使用插板法,总方案数就是 (nn+x−∑i∈s(ci+1)),乘上一个容斥系数然后相加就是了。
然后还有神秘非质模数,需要使用奇技淫巧组合数。
考虑 B,C 矩阵满足什么性质。设 Di,j 这个数的颜色是 i,那么 C 的每一行颜色都必须一样,B 的每一列必须包含所有 n 个颜色。我们发现这就是 m 个完美匹配。那么我们可以对于每个 Ai,j,建一条 i→col(Ai,j),容量为 1 的边,然后跑 m 次 dinic 就是了,复杂度 O(nmn)。
我们发现一个排列可以表示成许多个环,而我们需要构造的 A,B 也是一个排列,所以如果 Ai=Pi,它就会挤掉 APi 的值,让它不能取到 APi=Pi,而这样它又会挤掉下一个的值,以此往复,整个环都没有 Ai=i 的了。于是我们得到一个结论:一个环要么整个都没有 Ai=i,要么整个都是 Ai=i。
我们对于一个 Pi,Qi 分类讨论,设 Pi∈ai 的环,Qi∈bi 的环。(ai 和 bi 都只是环的编号)
- Pi=i,Qi=i
必定造成 1 的贡献 - Pi=i∧Qi=i
在 bi 被拆开时造成 1 的贡献。 - Pi=i∧Qi=i
在 ai 被拆开时造成 1 的贡献 - Pi=Qi=i
在 ai 和 bi 同拆和同不拆时造成 1 的贡献 - Pi=i∧Qi=i∧Pi=Qi
在 ai 和 bi 同拆时造成 1 的贡献。
于是我们就可以开始网络流求最小割。
- tot−1。
- s→bi,容量为 1。
- ai→t,容量为 1。
- ai↔bi,容量为 1。
- ai→bi,容量为 1。
最后的答案就是 tot−flow。
不该如此。