矩阵
我知道 世上的歌没有被 唱完的可能
我明白 张开翅膀需要有 怎样的英勇
我从来都不笨重 只是背着一个梦
笨鸥一直飞 伴着浪花的歌声
——洛天依《笨鸥》
矩阵
绝大部分应用是和矩乘相关的。常用于优化 dp 和与线段树等数据结构结合,或者说优化线性变换。
天依宝宝可爱!
洛谷 P3746
思维难度:\(\color{#52C41A} 绿\) *1600
怎么还可以把组合数转化成组合意义再 dp 的。
题意就是要求这个式子:
那个 \(\infin\) 可以不用管,因为当下标足够大的时候后面全都是 \(0\)。
显然不能直接求。但是注意到 \(k,r\) 都很小,而且每个下标 \(\bmod k\) 的值都为 \(r\),所以考虑转化为组合意义,那么上面这一坨就是在 \(nk\) 个物品里选 \(\bmod k = r\) 个满足的方案数。
显然是 dp 的形式,设 \(f_{i,j}\) 为前 \(i\) 个物品选 \(\bmod k = j\) 个的方案数,考虑是否选当前物品,有转移:
矩阵快速幂优化即可。复杂度 \(O(k^3 \log (nk))\)。
天依宝宝可爱!
洛谷 P7453
思维难度:\(\color{#F39C11} 橙\) *1000
线段树 + 矩阵乘法。
注意到要维护的所有对于三元组的操作都可以通过矩阵乘法来做,所以就直接线段树维护乘法就可以了。
但是卡常。需要循环展开 + 特判稀疏矩阵。
然后封装的 vector 板矩阵时间空间常数巨大,需要改成普通数组。
诶不过我线段树开 \(3\) 倍空间过了。
你说为什么不是用 littlebug(#541634) 交的题啊……因为被 某唐诗小朋友 举报小号过多然后给我封了()...
天依宝宝可爱!
LOJ 6208
思维难度:\(\color{#F39C11} 橙\) *1000
树剖套线段树维护矩乘。
两只老哥跑得快。
天依宝宝可爱!
AT_dp_r
思维难度:\(\color{#FE4C61} 红\) *900
矩阵加速 Floyd 板子。
(又忘了自己矩阵板子里 pow 函数是返回一个矩阵而不是改变自身
天依宝宝可爱!
AT_abc236_g
思维难度:\(\color{#FFC116} 黄\) *1400
普通的矩乘所需要的运算一个是 \(+\),一个是 \(\times\),广义矩乘就是换了换二元运算符,但是仍然需要满足普通矩乘的一些良好性质。
具体地,考虑二元运算符 \((\oplus , \otimes)\),则需要满足矩乘的式子:
等价于:
- \(\oplus\) 满足交换律,即 \(a \oplus b = b \oplus a\)。
- \(\otimes\) 计算顺序可改变(不是交换律),即 \(a \otimes (b \otimes c) = (a \otimes b) \otimes c\)。
- \(\otimes\) 对 \(\oplus\) 有分配律,对应的 \(\otimes\) 关于 \(\oplus\) 有结合律,即 \((a \otimes c) \oplus (b \otimes c) = (a \oplus b) \otimes c\)。
- 存在幺元,存在零元。
从群轮的角度,严格一些的定义的看 这里,如果链接炸了就是 这里。
一些常用的二元运算符以及对应的幺元和零元:
| id | 定义域 | \(+\) | \(\times\) | \(0\) | \(1\) |
|---|---|---|---|---|---|
| #1 | \(\mathbb R \cup \{ -\infin , +\infin \}\) | \(\min\) | \(\max\) | \(+\infin\) | \(-\infin\) |
| #2 | \(\mathbb R \cup \{ -\infin , +\infin \}\) | \(\max\) | \(\min\) | \(-\infin\) | \(+\infin\) |
| #3 | \(\mathbb R \cup \{ -\infin \}\) | \(\max\) | \(+\) | \(-\infin\) | \(0\) |
| #4 | \(\mathbb R \cup \{ +\infin \}\) | \(\min\) | \(+\) | \(+\infin\) | \(0\) |
| #5 | \(\forall n \in \mathbb N^+ , [0,2^n) \cap \mathbb N\) | 按位或 | 按位与 | \(0\) | \(2^n - 1\) |
| #6 | \(\forall n \in \mathbb N^+ , [0,2^n) \cap \mathbb N\) | 按位与 | 按位或 | \(2^n - 1\) | \(0\) |
Tip:用单位矩阵、全零矩阵的时候直接把对应的普通矩阵中的 \(0,1\) 换成上面对应的 \(0,1\) 即可。
回到这个题,第一步显然就是把时间戳当做边权建图。然后注意到 \(L\) 非常大,所以考虑矩阵快速幂优化。
令 \(f_{i,j}\) 为从 \(1\) 到达 \(i\) 恰好经过 \(j\) 条边的最大边权最小值,类似于 Floyd,显然有转移式:
满足上面 #1 的关系,于是直接矩阵快速幂就好了,容易推出转移矩阵:
天依宝宝可爱!

浙公网安备 33010602011771号