题面
link
一个长度为\(n\)的排列\(A\)的价值定义为:
有一个大小为\((n+2)\times(n+2)\)的网格,其中\((i,A_i)\)是障碍,从\((0,0)\)只能向下/向右走,走到\((n+1,n+1)\)的方案数。
给定一个不完整的排列\(A\),残缺的部分用\(-1\)表示,求所有情况下的价值和。
题解
想一下如果排列确定的情况下,即给定\(A\),权值怎么求。在网格比较小的时候可以直接遍历网格,但网格比较大的时候就需要容斥。(这个问题的详细分析见后面扩展部分)
但在这个题目中,有一些点是不确定有没有障碍的。肯定是要将这些障碍带来的效果相同的状态合并,但根本不好找到这个容易合并的效果。这就是这个题的精髓:用经过多少障碍点表示障碍带来的影响,最后通过容斥求出最终答案。
具体来说,设\(f[i][j][k][0/1][0/1]\)表示走到了\((i,j)\),前面经过了\(k\)个障碍,并且这一行/列有没有障碍,然后我们考虑转移,这下一个点是\((x,y)\)(即\((i+1,j)\)或\((i,j+1)\)):
- 若\(x,y\)不是已确定的障碍,方案数直接相加,并且新的行/列的占用情况要为\(0\)
- 若\(x,y\)这一行/列没有已经确定的障碍(包括最早确定的和在之前遍历确定的),则\(f[x][y][k+1][1][1]+=now\)
最后就可以容斥计算答案,注意这里\(|\bigcup S_i|\)的值。
扩展
仔细想了一下大网格的走路问题,我们是这么做的:
设\(-f[i]\)表示从\((0,0)\)到\((x_i,y_i)\)且不经过其他障碍的方案数。转移:
\[f[i]=-\sum_{j=1}^n f[j]\times \text{从$(x_j,y_j)$到$(x_i,y_i)$的方案数} \] 为什么是这样的?考虑容斥的式子
\[\begin{aligned} \left|\bigcap_{i=1}^{n}S_i\right|=\sum_{m=0}^n(-1)^{m}\sum_{a_i<a_{i+1} }\left|\bigcap_{i=1}^m\overline{S_{a_i}}\right| \end{aligned} \] 你发现,从\(f[j]\)要转移到\(f[i]\),后面的\(\sum_{a_i<a_{i+1} }\left|\bigcap_{i=1}^m\overline{S_{a_i}}\right|\)的\(m\)多了一,所以随之改变的是\(-1\rightarrow 1,1\rightarrow -1\),所以要乘上\(-1\)。这大概就是原理了。
启发
- 走路问题在这种多种障碍的情况下,可以通过经过多少个障碍+容斥的方法解决。
- 不知道之后能不能扩展出大网格走路问题配上多种障碍的题。