[题解]gdfzoj2145 奇怪的题目4

传送门

本场唯一一道自己想出的题

洗澡的时候 \(YY\) 出正解

还有别问我为什么模数是这个

本人语文能力有限,喷轻点。。

可以说是本场最良心的题了,没有码量,部分分也很多

\(24\) 分暴力: \(n^2 DP\) 不讲

\(48\) 分暴力:容斥 \(O(k 2^k)\)

想到这里的同学已经是史诗级大佬了

易得:答案 \(=\) 总路径条数 \(-\) 非法路径条数

考虑没有障碍的情况:没有非法路径,答案即为总路径数

考虑有一个障碍 \(A\) : 答案 = 总路径条数 \(-\) 经过 \(A\) 的路径条数

考虑有两个障碍 \(A\)\(B\)

非法路径数 = 经过 \(A\) 的路径数 \(+\) 经过 \(B\) 的路径数 \(-\) 同时经过 \(A\)\(B\) 的路径数

答案 = 总路径条数 \(-\) 非法路径数

...... 以此类推

所以我们可以对障碍进行排序,再二进制枚举状态,容斥即可

因为模数是个质数,所以两点之间的路径数可以直接用组合数求出(然后用加乘原理瞎搞

需要注意的是有时同时经过多个点的状态不存在。这个点我在求组合数的时候顺便解决了

正解:

正解就是将求非法路径数的时间复杂度变为 \(O(k^2)\)

\(path(x1,y1,x2,y2)\) 表示从 \((x1,y1)\) 走到 \((x2,y2)\) 的路径数 (不考虑障碍)

\(g[i]\) 表示从第 \(i\) 个陷阱,不经过其他任何陷阱,到达 \((n,m)\) 的路径数

\(g[i] = path(x_i,x_j,n,m) -\) 经过其他陷阱的路径数

易得

\(g[i] = path(x_i,x_j,n,m)\) $ - \sum\limits_{j=i+1}^{n}{}$ \(path(x_i,y_i,x_j,y_j)\) \(\times\) \(g[j]\) \(\times\) \([y_j>=y_i]\)

对于每一条非法路径,都至少经过一个障碍

我们枚举每个障碍, \(path(0,0,x_i,y_i) \times g[i]\) 就为 经过的最后一个障碍为 \(i\) 的路径个数

然后相加即为非法路径条数

代码(巨丑无比)

完结撒花

posted @ 2020-04-20 20:15  ZSH_ZSH  阅读(166)  评论(4编辑  收藏  举报