Atcoder abc323
https://atcoder.jp/contests/abc323
G - Inversion of Tree
给定一个 1~n的排列p
1 | for k = 0..n-1: |
n 500
4s
1024mb
我的思路
因为这里要的相反不是 父子和p相反,而是index
和p[index]
相反, 所以如果要选根,选1就行
然后问题是 如果在树上做dp,不光要记录满足树和子树的点树,还需要记录哪些点已经用了,感觉这状态有点多
注意到$n\le 500$是有点小的,可能有$n^2,n^3$的考虑的方向,但实际上这里还有一个k,所以可能是$nk,n^2k,nk^2$一类的
但直接的思路还是没有
然后就是插入新点的想法
如果有一个n-1点的方案,那么对于 p[1]...p[n-1]
需要把所有大于$p[n]$的p进行减1,这样就是规模减1的子问题,
但是问题是,这样的话,并没有看出n-1到n的转移
首先钦定了根是1,所以(n,p(n))不是根,如果它是叶子,那么 一个n-1树上原来叶子p[叶] >= p[n]
都会贡献到对应的k+1, 而原来p[叶] < p[n]
会贡献到k
那还不用说非叶子的,光是这里,就需要记录叶子的p和更大的p之间的关系的个数,那么更小的层数时要记的关联太多了
似乎连一个暴力的计数法都没有
然后 如果 == k难求,可以考虑求 $\le k$ 然后做相邻相减
题解
Kirchhoff’s theorem: 无自环可重边无向图的 基尔霍夫矩阵(拉普拉斯矩阵)的任意余子式的行列式 = 树的个数
而 定理中的证明过程有用到
$B$是行表示点,列表示边的,值+1/-1表示大小点的邻接矩阵
$L=B\cdot B^T$
$L$去掉第i行第i列的主余子式 $= \sum_{选n-1列} \mathrm{det}(B_{去掉i行选n-1列})\mathrm{det}(B_{去掉i行选n-1列}^T)$
而如果我们让 满足本题统计的 逆向边乘上 $\sqrt{x}$, 其中$x$是生成函数里一样的$x$没有具体值的一个单位
那么一个具体的树的贡献 就是
$x^{满足题意统计的个数}$
那么$[x^k] L$的主余子式,就是要求的$\mathrm{ans}_k$
因此 $L_{i,j}$为$1$或$x$(看i和j的关系)求出的$L$的主余子式还是一个 生成函数
因此问题变成了计算一个$M_0+M_1x$的行列式的问题,(因为本题对应的L只包含1(不满足题意统计),n-1(对角线的度),x(满足题意统计)
$O(N^4)$的办法
把$x=0\cdots N$带入 求行列式
再反过来求系数
每次求行列式是$O(N^3)$因此总的是$O(N^4)$
$O(N^3)$的办法
把$\mathrm{det}(xI-M)$称作矩阵$M$的 特征多项式
而特征多项式可以$O(N^3)$ https://judge.yosupo.jp/problem/characteristic_polynomial
所以需要转化
如果$M_0+M_1x$中的$M_1$是regular的(行列式不为0),可以通过初等行列变换(elementary row and column operations.)成I,即存在$I=AM_1B$
那么有$\det({M_0 + M_1 x })= \frac{1}{\det A \det B}\det(A (M_0 + M_1 x)B) = \frac{1}{\det A \det B}\det(AM_0B + I x),$
那么只要找到$AM_0B$再用 计算特征多项式的算法
如果$M_1$是 not regular
随机取一个$a$
令$y = x-a$有$x=y+a$
$\det({M_0 + M_1 x })= \det({M_0 + M_1 (y+a) })= \det({(M_0+M_1a) + M_1y})$
注意到$\det({(M_0+M_1a) + M_1y})$与$\det({(M_0+M_1a)z + M_1})$ 在对应的特征多项式 的y幂次与z的幂次 正好 逆幂次对应系数
所以 可以求$\det({(M_0+M_1a)z + M_1})$ , 而$M_0+M_1a$因为随机取的关系,有高概率是 regular的
另一个想法是整体的想法, 当我们在 对$M_0+M_1x$ 进行基础行列变换时,它的整体是一个
1 | i当前要处理的列 |
如果对于$M_1$做变换时 在列上 找不到非0的系数,说明该列全为不带x的值,不妨把该列直接乘上x
1 | i当前要处理的列 |
这样整个行列式 被乘上了x, 最后做偏移量即可,比随机取一个a更确定性
,而且对应的操作也就是把$M_0$的对应列搬到$M_1$,如果操作数大于n 直接表达式就为0了
特征多项式O(N^3)
$\mathrm{det}(I_nx-A_{n\times n})$
- 利用相似矩阵特征多项式相同的性质将给定矩阵消成
上 海森堡 矩阵
。 - 使用行列式展开定理递推计算它的特征多项式。
相似矩阵行列式相等
$A\sim B$那么
$|A|=|P^{-1}BP|=|P^{-1}||B||P|=|P^{-1}||P||B|=|P^{-1}P||B|=|I||B|=|B|$
相似矩阵特征多项式相等
$A\sim B$那么
$|\lambda I -A|=|P^{-1}(\lambda I -B)P|=|P^{-1}||\lambda I-B||P|=|P^{-1}||P||\lambda I-B|=|\lambda I -B|$
我们用上面的这个思路把矩阵变成 这样的形式(上 海森堡 矩阵)
左乘行变换,右乘列变换,例如
- (第3
n行减去k倍第2行)A(第2列加上k倍的3n列)就能完成第1列的 下方0 - (第4
n行减去k倍第3行)A(第3列加上k倍的4n列)就能完成第2列的 下方0
$$\begin{pmatrix} a_{1,1}&a_{1,2}&a_{1,3}&\cdots&a_{1,n}\\ a_{2,1}&a_{2,2}&a_{2,3}&\cdots&a_{2,n}\\ 0&a_{3,2}&a_{3,3}&\cdots&a_{3,n}\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ 0&0&0&\cdots&a_{n,n} \end{pmatrix}$$
$\displaystyle f_n(x)=(x-a_{n,n})f_{n-1}(x)-\sum_{i=1}^{n-1}f_{n-i-1}(x)\left( \prod_{j=n-i+1}^n a_{j,j-1} \right) a_{n-i,n}$
可以$O(n^3)$算出
代码
https://atcoder.jp/contests/abc323/submissions/49822377
1 |
|
总结
G:
abc253出现过一次矩阵树定理
所以 图的生成树问题就要向 基尔霍夫定理(矩阵树)想,第二次遇到了,回忆是做过但自己没想到
Hessenberg算法第一次学 https://judge.yosupo.jp/problem/characteristic_polynomial