minosi
题意:有一个 n×m 的矩阵,每个格子有黑白两种颜色。所有黑色的格子只能从左方或上分进入,白色格子只能从右方或下方进入。求是否能走恰好 k 步从 (1,1) 走到 (n,m)。n×m≤300,k≤106。
做法一
可以直接 O(nmk) DP。令 f[k][i][j] 表示从 (1,1) 走 k 步是否能走到 (i,j),则
f[k][i][j]={f[k−1][i−1][j] or f[k−1][i][j−1]f[k−1][i+1][j] or f[k−1][i][j+1](i,j) is black(i,j) is white
空间上可以使用滚动数组优化掉第三维。
这种做法虽然可以通过,但没有达到极限。我们可以考虑将格子从 1 到 nm 按正常顺序编号(即 (i,j)→(i−1)⋅m+j),则设 f[k][x] 表示恰好走 k 步是否能做到编号为 x 的节点。转移类似,用编号法表示一下即可:
f[k][x]={f[k−1][x−1] or f[k−1][x−m]f[k−1][x+1] or f[k−1][x+m](i,j) is black(i,j) is white
这样的好处是什么呢?由于 f 的值只能为 0/1,所以我们可以使用 bitset 来存某一个 k 的所有位置的可达性,则对于所有黑格子,f[k]=(f[k−1]>>1)∣(f[k−1]>>m),白格子类似。
对于黑白格子的区分,预处理两个 bitset 表示格子颜色,需要提取某种颜色时按位与一下即可。还有一点需要注意,就是判断格子的边界。无法从上一行的最后一列转移到这一行的第一列,特殊处理一下即可。时间复杂度 O(ωnmk)。
做法二
倍增优化传递闭包。
未完待续…
carpet
题意:平面上有 n 个矩形(通过左下角和右上角坐标描述),求有多少面积被至少 n−1 个矩形覆盖。T≤5,n≤3×105,0≤val≤109。