专题练习记录
一、线段树优化建图
二、DP练习
2.1区间DP
2.2数位DP
2.3树形DP
2.4笛卡尔树DP
2.5单调性优化DP
2.6DP套DP
2.7自动机DP
2.8计数类DP
2.9组件DP
2.10杂题
三、矩阵加速图上问题
3.1简单路径计数
给定邻接矩阵\(\mathcal A\),\(\mathcal A\)的\(k\)次幂代表每个点经过\(k\)条边(边权为1)到达点的方案数。
上面两道题都是直接询问经过\(k\)条边到达某个点的方案数,直接做即可。
3.2广义矩阵乘法&优化Floyd
若 \(\otimes\)运算满足交换律、结合律,且\(\otimes\)对\(\oplus\)存在分配律,即存在\(\left(\bigoplus a\right)\otimes b = \bigoplus \left( a\otimes b \right)\) 时,广义矩阵乘法满足结合律。
有了广义矩阵乘法,我们就可以对各类二元运算进行快速幂运算,其中最典型的应用是用来优化Floyd。
需要注意的是,与\(\mathtt{3.1}\)不同,我们现在需要将边权放进矩阵里参与运算。
3.3处理技巧
3.3.1拆点
如果边有边权,我们可以考虑拆点,将每个点依据出边的边权不同拆成不同状态的点,不同状态的点之间由对应边权小的向边权大的连边。
3.3.2点边互换
这道题不能立刻走回头路。
我们把所有有向边看做点(无向边转两条有向边),并连出一些边。两条边代表的点连起来,当且仅当一条边的终点为另一条边的起点。这样经过连边之后会形成一个有向图。\(s\)到\(t\)的路径长度为在这张图上表现为:射出的边在图中的所有结点到射向的所有边在图中的所有结点之间的路径长度为\(k-1\)。(引用自博客)
我们只需要把一条边代表的两个点之间的点去掉就可以保证不走回头了。
3.3.3周期分组快速幂
对于不同时刻矩阵\(\mathcal A\)的状态不同但是有周期性时,我们可以令\(\mathcal{T}=\prod{\mathcal{A_i}}\),我们对矩阵\(\mathcal{T}\)做快速幂,对于余数暴力处理即可。
3.3.4倍增预处理,按时间顺序统计
当一道题目需要多次询问时,如果我们对于每个询问都用\(O(n^3\log T)\)的时间处理的话是一个不小的开销。
观察到我们需要的值通常只有矩阵的第一行,我们可以倍增预处理出各个时刻矩阵第一行的值,这样每个询问我们都可用\(O(n^2\log T)\)的时间处理(因为参与相乘的答案矩阵只有1行,省掉了一维)。
3.3.5bitset优化
如果我们最终只需要知道矩阵中某个元素是否为\(0\),而不关心它矩阵的值,我们可以用bitset进行优化,使得单次矩阵乘法的复杂度优化为\(O(\frac{n^3}{w})\)
3.4综合应用
有了系统的学习,这道题的思路就很清晰了:拆点+广义矩阵乘法+倍增预处理,按时间顺序统计。
要是没学过直接上场的话,估计就直接跪了。。。