潍泰联测好题集锦
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\)。

浙公网安备 33010602011771号