潍泰联测好题集锦

minosi

题意:有一个 \(n\times m\) 的矩阵,每个格子有黑白两种颜色。所有黑色的格子只能从左方或上分进入,白色格子只能从右方或下方进入。求是否能走恰好 \(k\) 步从 \((1,1)\) 走到 \((n,m)\)\(n\times m\le 300,k\le 10^6\)

做法一

可以直接 \(O(nmk)\) DP。令 \(f[k][i][j]\) 表示从 \((1,1)\)\(k\) 步是否能走到 \((i,j)\),则

\[f[k][i][j]= \begin{cases} f[k-1][i-1][j]\texttt{ or }f[k-1][i][j-1] & (i,j)\text{ is black}\\ f[k-1][i+1][j]\texttt{ or }f[k-1][i][j+1] & (i,j)\text{ is white} \end{cases} \]

空间上可以使用滚动数组优化掉第三维。

这种做法虽然可以通过,但没有达到极限。我们可以考虑将格子从 \(1\)\(nm\) 按正常顺序编号(即 \((i,j)\to(i-1)\cdot m+j\)),则设 \(f[k][x]\) 表示恰好走 \(k\) 步是否能做到编号为 \(x\) 的节点。转移类似,用编号法表示一下即可:

\[f[k][x]= \begin{cases} f[k-1][x-1]\texttt{ or }f[k-1][x-m] & (i,j)\text{ is black}\\ f[k-1][x+1]\texttt{ or }f[k-1][x+m] & (i,j)\text{ is white} \end{cases} \]

这样的好处是什么呢?由于 \(f\) 的值只能为 \(0/1\),所以我们可以使用 bitset 来存某一个 \(k\) 的所有位置的可达性,则对于所有黑格子,\(f[k]=(f[k-1]>>1)|(f[k-1]>>m)\),白格子类似。

对于黑白格子的区分,预处理两个 bitset 表示格子颜色,需要提取某种颜色时按位与一下即可。还有一点需要注意,就是判断格子的边界。无法从上一行的最后一列转移到这一行的第一列,特殊处理一下即可。时间复杂度 \(O(\frac{nmk}{\omega})\)

做法二

倍增优化传递闭包。

未完待续...

carpet

题意:平面上有 \(n\) 个矩形(通过左下角和右上角坐标描述),求有多少面积被至少 \(n-1\) 个矩形覆盖。\(T\le 5,n\le 3\times 10^5,0\le val\le 10^9\)

posted @ 2023-03-01 16:12  曹轩鸣  阅读(20)  评论(0)    收藏  举报