\(\text{I}\). [AGC035F] Two Histograms
显然一个网格不只对应一个操作序列,于是考虑什么情况下一个网格会对应多个操作序列。一个简单的例子如下
0 0 1 0
0 0 1 0
0 0 1 0
1 1 1 0
0 0 0 0
此时 \(k_3=2\land l_3=3\) 和 \(k_3=3\land l_3=2\) 就重复了。因此,猜测不考虑存在 \(i,j\) 满足 \(k_i=j-1,l_j=i\) 的网格就可以不重不漏的表示每一种情况:
-
不漏:考虑将 \(k_i\) 改为 \(j\),\(l_j\) 改为 \(i-1\) 后网格显然不变。
-
不重:考虑两个不满足上述条件的操作序列 \(k,l\) 和 \(k^\prime,l^\prime\),假设两者表示的网格是相同的。
找到最小的 \(j\) 满足 \(l_j\not=l^\prime_j\),不妨设 \(l_j<l^\prime_j\)。记 \(i=l^\prime_j\)。
因为 \((i,j)\) 这个位置要相同,所以有 \(k_i\ge j\land k^\prime_i<j\)。然后再分类讨论:
-
若 \(j=1\),说明 \(k^\prime_i=0=j-1\),与题设矛盾。
-
否则,有 \(k^\prime_i<j-1\)。又因为 \(l_{j-1}=l^\prime_{j-1}\),所以 \((i,j-1)\) 这一位置不合法,与假设矛盾。
-
综上,只需计数不存在 \(i,j\) 满足 \(k_i=j-1,l_j=i\) 的网格的情况。
考虑容斥,将一组 \(k_i=j-1,l_j=i\) 看作匹配。设 \(f_i\) 表示钦定形成了 \(i\) 对匹配的方案数,那么有
前面的 \(\binom{n}{i}\binom{m}{i}i!\) 是选出 \(i\) 行 \(i\) 列并匹配的方案数,后面的是其他行列的方案数。
而不存在匹配的方案数就可以容斥,得到
\(\text{II}\). [ABC306Ex] Balance Scale
先不考虑 =
的情况。
考虑若 \(v(a_i)<v(b_i)\),就从 \(a_i\) 向 \(b_i\) 连一条有向边。这样一定会形成 DAG。
考虑在 DAG 上分层 DP。设 \(f_s\) 表示点集 \(s\) 内的方案数,每次加入在最后加入点集 \(t\)。
但这样会算重,考虑给每个 \(t\) 一个容斥系数。手模一下可以发现容斥系数为 \((-1)^{\left|t\right|+1}\)。
再考虑 =
,这就相当于在图上把两个点缩成了一个点。
然后再枚举 \(t\),这时 \(t\) 内部的边都一定是 =
,容斥系数为 \((-1)^{\text{连通块个数}+1}\)。
\(\text{III}\). Luogu P11173 「CMOI R1」We Want To Run / Nilpotent
经典地,把矩阵看作一张图。那么一张图的贡献就是其最长路径上的节点数,若有环则无贡献。
进一步的,对于一个 DAG,它还对应这 \((a-1)\) 的边数次方个矩阵,所以贡献要乘上这个系数。
先考虑一个暴力的 DP,设 \(f_{d,i,j}\) 分别表示当前的 DAG 有 \(d\) 层,总节点数为 \(i\),最后一层的节点数为 \(j\) 时对应的矩阵的方案数。那么答案就是 \(\sum_{d=1}^n\sum_{i=1}^nf_{d,n,i}\times d\)。
转移就枚举下一层的节点数 \(k\),然后考虑计算系数。显然有 \(\binom{n-i}{k}\),至于剩下的,这一层的 \(j\) 个点中至少要连一条边,方案数为
类似地,上面的 \(i-j\) 个点可以随便连,方案数为
这样是 \(O(n^4)\) 的,考虑优化。
注意到 \(d\) 不会影响转移,只会用于计算答案,于是另设 \(g_{d,i,j}=f_{d,i,j}\times d\),这样就可以把 \(d\) 这一维消掉了。