###name
双面棋盘
###descirption
佳佳有一个 n 行 n 列的黑白棋盘,每个格子都有两面,一面白色,一面黑色。佳佳把棋盘平放在桌子上,因此每个格子恰好一面朝上,如下图所示:
我们把每行从上到下编号为 1,2,3,……,n,各列从左到右编号为 1,2,3,……,n,则每个格子可以用棋盘坐标(x,y)表示。在上图中,有8个格子黑色朝上,另外17 个格子白色朝上。
如果两个同色格子有一条公共边,我们称这两个同色格子属于同一个连通块。上图共有 5 个黑色连通块和 3 个白色连通块。
佳佳可以每分钟将一个格子翻转(即白色变成黑色,黑色变成白色),然后计算当前有多少个黑色连通块和白色连通块,你能算得更快吗?
###input
输入文件的第一行包含一个正整数 n,为格子的边长。以下 n 行每行 n 个整数,非 0 即 1,表示初始状态。0 表示白色,1 表示黑色。下一行包含一个整数 m,表示操作的数目。以下 m 行每行两个整数 x, y (1 ≤ x, y ≤ n),表示把坐标为(x,y)的格子翻转。
###output
输出文件包含 m 行,每行对应一个操作。该行包括两个整数 b, w,表示黑色区域和白色区域数目。
###sample input
5
0 1 0 0 0
0 1 1 1 0
1 0 0 0 1
0 0 1 0 0
1 0 0 0 0
2
3 2
2 3
###sample out
4 3
5 2
###hint
○1 ≤ n ≤ 200
○1 ≤ m ≤ 10,000
###toturial
用线段树维护并查集,每个节点维护两个并查集,最上面的一行和最下面的一行,合并的时候根据四个并查集来维护即可,注意并查集的合并操作要仔细即可。
###code
1 |
|
- 本文作者: fightinggg
- 本文链接: http://fightinggg.github.io/yilia/yilia/PVYVMY.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!