矩阵优化做题简单分类
矩阵优化简单总结
拆点技巧
有些题目中边有长度,但不会太长,如果对于每条边都拆成长度个点的话由于边会太多,导致时间复杂度会爆炸,所以只能拆点,将一个点拆成变成个点,一个点内部连长度为 1 的边。
例题:P4159 [SCOI2009] 迷路,P6772 [NOI2020] 美食家。
点边互换技巧
有些题目不能走上次走过的边,但是矩阵相乘的时候并不知道上次是走的是什么边,只知道上次经过的是哪一个点,所以可以把边和点的角色互换一下,达到不能走回头路的限制。
分段处理技巧
有些题目中会给你一些特殊时间(个数不会太多),满足在这个事件前后边或点的状态是不一样的,或者在这个时间点会获得一些特殊贡献。这种情况我们就不能忽略这个分界点。所以我们可以在分界点和分界点之间用矩阵加速,分界点处特殊处理。
例题:Flights for Regular Customers,P6772 [NOI2020] 美食家。
周期处理技巧
类似于分段处理,只不过这种情况特殊时间的个数太多了,不能枚举,但是特殊时间是循环的,有周期性的。这样我们可以整个整个周期的加速,最后把零头给补一下。
例题:P2579 [ZJOI2005]沼泽鳄鱼,P2579 [ZJOI2005]沼泽鳄鱼。
二进制拆分技巧
常常和分段处理技巧一块用。矩阵和矩阵相乘是 \(O(n^3)\) ,而向量乘矩阵是 \(O(n^2)\) 的,有些题目会让你把一个状态多次和矩阵相乘,这样每次相乘都是 \(O(n^3\log T)\) 的。总时间就是 \(O(mn^3\log T)\) 的,\(m\) 是相乘次数会 TLE。但是我们可以把矩阵的二的整数次幂预处理出来,每次用这个状态乘上它们,这样时间就是 \(O(n^3+mn^2\log T)\) 的了。例如 P6772 [NOI2020] 美食家 ,你就可以在处理过关键点之后用这个技巧跳到下一个关键点。
例题:P6569 [NOI Online #3 提高组] 魔法值,P6772 [NOI2020] 美食家
广义矩阵
上述情况大多都是求,从 S 到 T 的方案数。有些题目是求从 S 到 T 的最短距离,这种递推式可以用 Floyd 的式子,也是满足结合律的,但由于本人太功利了,并不会证明。还有些题目是和异或操作相关的,这显然满足结合律,可以用矩阵加速。这样的矩阵称作 广义矩阵。
例题:[USACO07NOV]Cow Relays G,P6569 [NOI Online #3 提高组] 魔法值,P6772 [NOI2020] 美食家,[NOI Online #1 入门组] 魔法,P3502 [POI2010]CHO-Hamsters。
发现???
会发现 P6772 [NOI2020] 美食家 这一题覆盖了大多数技巧,是一道非常好的矩阵优化题目。
标签&简单题解
这个题非常裸,n 只有八矩阵就是你指向你两边,注意 E 只能指向自己。
这一题用到了拆点的技巧,也非常裸。
这个题就有点意思了,不能经过上次经过的边,可以考虑把边换成点,一正一反。
4.Flights for Regular Customers
这个题的做法有点类似 P6772 [NOI2020] 美食家,都是从小到大枚举一个节日或时间啥的,这个时间段前后要特殊处理一下,本题就是统计这个时间之前能到达的点,并且在这个时间之后解锁一条边。
注意 lcm(2,3,4)=12 所以我们可以把一个点拆成12个,然后分成12种时间建图。先把整块12的跑掉,再跑零头。
广义矩阵,将 \(+\) 改为 min ,\(\times\) 改为 \(+\) 即可,类似于 Floyd。
7.P6569 [NOI Online #3 提高组] 魔法值
广义矩阵,此题用到了技巧 向量乘矩阵是 \(O(n^2)\),可以先预处理出矩阵的幂次,对于每个向量能 \(O(n^2\log n)\) 计算而非 \(O(n^3\log n)\)。
广义矩阵,这个题的做法有点类似 Flights for Regular Customers,都是从小到大枚举一个节日或时间啥的,这个时间段前后要特殊处理一下,本题就是在美食节当天给这个位置的收获加上贡献,之后在用矩阵加速,说白了就是两个特殊时间矩阵加速,特殊时间特殊处理。
硬要说的话和 P2233 [HNOI2002]公交车路线) 有点像,但是这一题在每个时间都可以停止,那一题是在一个位置可以停止,对于这种可以随时停止的需要再开一个节点记录答案,如果想停止,直接走向新开的节点。
广义矩阵,先做一遍 Floyd ,考虑从 i 到 j 翻转一次的最小值,胡乱整一下,反转 \(K\) 次就行了,细节有点多。
11.P3502 [POI2010]CHO-Hamsters
没用矩阵,但这一题和 [USACO07NOV]Cow Relays G 几乎一模一样,🕊️
12.P3821 Isaac
和 P2579 [ZJOI2005]沼泽鳄鱼 真是一模不一样,改成广义的就行了,将 \(+\) 改为 min ,\(\times\) 改为 max 即可。
woc,终于有一个和图无关的了(好像 P3502 [POI2010]CHO-Hamsters 也无关,但它和 [USACO07NOV]Cow Relays G 几乎一模一样,所以也有关),而这种 矩阵优化加速递推需要记录你这个位置前 \(K\) 个 a ,通过 \(K\) 个 b 转移 \(n\) 次,每次转移的递推式一模一样,而且能发现,这个式子是又结合律的,所以可以通过矩阵优化加速递推,一般来说,有结合律的东西都可以这样加速。