题解:P10817 [EC Final 2020] Rectangle Flip 2
感谢我的队友,给了我一定的思路!
队友看了题,说:“用单调栈,
题解:
很简单,对于每个删除的点,看会影响多少新矩形。枚举矩阵的左右每个位置,维护其的上下界 ( 可以外枚举下边界,确定下边界后,内枚举上边界 ),影响的数量是
求完这个点会影响的好的矩形的数量,就在看这个点会对后面的点产生的影响。
这个影响无非就是,对后面的点在求每行能扩的最大边界的产生影响。
时间复杂度
code:
void solve(int x, int y) {
int bb = b[x][y], cc = c[x][y];
for (int i = y; i >= 1; i--) {
if (a[x][i] == 1) break;
int bbb = b[x][y], ccc = c[x][y];
bb = max(b[x][i], bb), cc = min(c[x][i], cc);
for (int j = y; j <= m; j++) {
if (a[x][j] != 0) break;
bbb = max(b[x][j], bbb), ccc = min(c[x][j], ccc);
maxx = max(bb, bbb), minn = min(cc, ccc);
ans -= (x - maxx + 1 ) * (minn - x + 1);
}
}
a[x][y] = 1;
for (int i = x - 1; i >= 1; i--) {
if (a[i][y] == 0 )c[i][y] = x - 1;
else break;
}
for (int i = x + 1; i <= n; i++) {
if (a[i][y] == 0) b[i][y] = x + 1;
else break;
}
}