其实是我之前写的一篇博客的推广
大意:
一个阶梯型,第 i i i行有 ⌈ i / 2 ⌉ ∗ 2 \left \lceil i/2 \right \rceil*2 ⌈i/2⌉∗2个方块,总共有n行。在其中给定 m m m个点无法经过,求从左上角到右下角的方案数。其中每次移动只能向右或向下
N ≤ 2.5 e 5 , M ≤ 50 N\leq 2.5e5,M\leq 50 N≤2.5e5,M≤50
思路:
一个比较显然的思路是把原图还原为 n × n n\times n n×n的矩阵,然后再添加 n − 2 n-2 n−2个障碍 ( i , ⌈ i / 2 ⌉ ∗ 2 + 1 ) (i,\left \lceil i/2 \right \rceil*2+1) (i,⌈i/2⌉∗2+1),这样就还原成了经典模型,可以直接用容斥来做。
还是将障碍按横纵坐标排个序,同时不妨将终点也放入 S S S中,显然排序后它会是最后一个点
令 S S S表示障碍的集合, d p i dp_i dpi表示从起点到第i个障碍,中间不经过其它障碍的方案数, w i w_i wi表示S中的第i个障碍, g ( ⋅ ) g(\cdot) g(⋅)表示两点之间的所有最短路的方案数(不考虑中间是否经过障碍)
不难得到一个非常naive的式子:
d p i = g ( ( 1 , 1 ) , w i ) − ∑ j < i g ( j , i ) d p j a n s = d p ∣ S ∣ + 1 dp_i=g((1,1),w_i)-\sum_{j<i}g(j,i)dp_j\\ ans = dp_{|S|+1} dpi=g((1,1),wi)−j<i∑g(j,i)dpjans=dp∣S∣+1
但是这样做的时间复杂度是 O ( ( n + m ) 2 O((n+m)^2 O((n+m)2,尝试优化
首先对式子换一个好看点的形式:
令 f i = d p i f_i=dp_i f