ARC118E

题面

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\)。这大概就是原理了。

启发

  • 走路问题在这种多种障碍的情况下,可以通过经过多少个障碍+容斥的方法解决。
  • 不知道之后能不能扩展出大网格走路问题配上多种障碍的题。
上一篇:算法训练 反置数 java 题解 93


下一篇:[学习笔记]线性规划