band-matrix 的特殊高斯消元

band-matrix(带状矩阵)是指只有两条对角线之间有值、其余全是 \(0\) 的矩阵。记两条对角线的距离为 \(d\),这种矩阵高斯消元可以做到 \(O(nd^2)\)。普通的高斯消元是 \(O(n^3)\) 的。

优化的点在于有很多位置不需要消元:从 \((i,i)\) 向右、向下走,至多 \(d\) 个地方有值。

回顾一下普通高斯消元:

  • 枚举 \(i\),准备消元第 \(i\) 维。

  • 如果第 \(i\) 行第 \(i\) 列是 \(0\),在之后找到一个第 \(i\) 列是 \(0\) 的行交换过来。

  • 用第 \(i\) 行把后面行的第 \(i\) 维消掉。

因为从 \((i,i)\) 向右、向下走,至多 \(d\) 个地方有值,所以第二步只需要检查之后的 \(d\) 行,第三步只用消之后的 \(d\) 行,每行只需要消第 \(i\) 列往后的 \(d\) 个元素。所以复杂度能做到 \(O(nd^2)\)

这里有一个注意点:在做第二步的时候如果交换行,那可能导致带状的性质被破坏。这里又有两种处理方法:

  • 因为换上来的行只比第 \(i\) 行向下 \(d\) 行,所以这一行至多比第 \(i\) 行向右多 \(d\) 个元素。在消后面行的时候多消 \(d\) 个(一共消 \(2d\) 个)位置就行了。

  • 找到第 \(i\) 行其它一个非零位置 \(M_{i,j}\),然后整个矩阵交换第 \(i,j\) 列。不过 \((i,j)\) 向下能走到的非零位置个数可以比 \((i,i)\)\(j-i\) 个。所以在消后面行的时候多消 \(j-i\) 行即可。

  • 一个是对列的、一个是对行的。灵活使用,适当根据矩阵性质修改方案。


例题:P6899

有一个 \(h\)\(w\) 列的网格图,有一些是空的,有一些是洞,有一些是障碍物。从第一行的空的格子中随机选一个放置一个球,向上下左右移动的概率比为 \(p_u : p_d : p_l : p_r\)(满足 \(p_u + p_d + p_l + p_r = 100\)),不会移动到有障碍物的格子上。

对于每个洞,求落入该洞的概率。

\(w \le 20, h \le 10000\),5s。保证第一行没有洞。


考虑一点暴力做法,\(f(i,j)\) 表示球经过了 \((i,j)\) 的概率。然后跑高斯消元。

直接做是 \(O((nm)^3)\) 的,需要优化。

先写出方程。记 \(cnt\) 为第一行空地个数,\(ps = p_u+p_d+p_l+p_r\)

\[f(i,j)=\frac{p_uf(i+1,j)+p_df(i-1,j)+p_lf(i,j+1)+p_rf(i,j-1)}{ps}+\frac{[i=1]}{cnt} \]

考虑优化高斯消元的过程,考虑到【band-matrix 上的高斯消元优化】。

注意到,\((i,j)\)\((i\pm 1,j\pm 1)\) 如果用 \(i\cdot w+j\) 编号,它们的编号差是 \(O(w)\) 的。也就是说一共 \(h\times w\) 条方程,第 \(x\) 条上有值的位置为 \(x\pm w\) 列内。

那么直接套优化即可做到 \(O((hw)\cdot w^2)=O(hw^3)\) 可以通过。

posted @ 2025-11-19 16:11  FLY_lai  阅读(1)  评论(0)    收藏  举报