潍泰联测好题集锦

minosi

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

做法一

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

f[k][i][j]={f[k1][i1][j] or f[k1][i][j1](i,j) is blackf[k1][i+1][j] or f[k1][i][j+1](i,j) is whitef[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}

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

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

f[k][x]={f[k1][x1] or f[k1][xm](i,j) is blackf[k1][x+1] or f[k1][x+m](i,j) is whitef[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}

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

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

做法二

倍增优化传递闭包。

未完待续…

carpet

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