Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 784 Solved: 422
[Submit][Status][Discuss]

Description

佳佳有一个 nnn 行 nnn 列的黑白棋盘,每个格子都有两面,一面白色,一面黑色。佳佳把棋盘平放在桌子上,因此每个格子恰好一面朝上,如下图所示:

QQ20180116200234.png

我们把每行从上到下编号为 111 ,222 ,333 ,……,nnn ,各列从左到右编号为 111 ,222 ,333 ,……,nnn ,则每个格子可以用棋盘坐标(x,y)(x, y)(x,y) 表示。在上图中,有 888 个格子黑色朝上,另外 171717 个格子白色朝上。

如果两个同色格子有一条公共边,我们称这两个同色格子属于同一个连通块。上图共有 555 个黑色连通块和 333 个白色连通块。

佳佳可以每分钟将一个格子翻转(即白色变成黑色,黑色变成白色),然后计算当前有多少个黑色连通块和白色连通块,你能算得更快吗?

Input

输入文件的第一行包含一个正整数 nnn ,为格子的边长。以下 nnn 行每行 nnn 个整数,非 000 即 111 ,表示初始状态。000 表示白色,111 表示黑色。下一行包含一个整数 mmm ,表示操作的数目。以下 mmm 行每行两个整数 xxx , yyy (111 ≤ xxx , yyy ≤ nnn ),表示把坐标为(x,y)(x, y)(x,y) 的格子翻转。

Output

输出文件包含 mmm 行,每行对应一个操作。该行包括两个整数 bbb , www ,表示黑色区域和白色区域数目。
【约定】

○1 ≤ n ≤ 200

○1 ≤ m ≤ 10,000

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 Output

4 3
5 2

HINT

翻转(3,2)(3, 2)(3,2) 之后,棋盘变为:

QQ20180116200629.png

有 444 个黑色区域和 333 个白色区域

翻转(2,3)(2, 3)(2,3) 之后,棋盘变为:

QQ20180116200639.png

有 555 个黑色区域和 222 个白色区域

Source

鸣谢刘汝佳先生授权使用

题解

用线段树维护行,并查集合并
线段树每个节点维护区间[l,r]中,行l的并查集,行r的并查集,用于查询l与r的联通情况,维护[l,r]行的白色连通块数和黑色连通块数。维护并查集父节点个数。

合并即可。

注意,并查集维护的时候,其所指的父亲不是这些格子自身,而是虚出来的节点。在两个区间合并的时候,处理虚的节点的连通性,右区间虚节点编号要加上左区间虚的节点的个数,合并后的虚节点继承回区间的左右并查集即可。离散化一下,不然可能会很大。。

推荐题解

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <map>
#include <cmath>
inline int max(int a, int b){return a > b ? a : b;}
inline double max(double a, double b){return a - b > 0 ? a : b;}
inline int min(int a, int b){return a < b ? a : b;}
inline void swap(int &x, int &y){int tmp = x;x = y;y = tmp;}
inline void read(int &x)
{x = 0;char ch = getchar(), c = ch;while(ch < '0' || ch > '9') c = ch, ch = getchar();while(ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();if(c == '-') x = -x;
}
const int INF = 0x3f3f3f3f;
const int MAXN = 200 + 10;
int n, q, fa[MAXN << 2], g[MAXN][MAXN], vis[MAXN << 2];
int find(int x)
{return x == fa[x] ? x : fa[x] = find(fa[x]);
}
struct Node
{int cnt, fal[MAXN << 1], far[MAXN << 1], wsize, bsize, l, r;Node(){cnt = wsize = bsize = l = r = 0, memset(fa, 0, sizeof(fa)), memset(far, 0, sizeof(far));}
}node[MAXN << 2];void pushup(int o)
{int l = o << 1, r = o << 1 | 1;if(node[l].cnt == 0){node[o] = node[r];return;}if(node[r].cnt == 0){node[o] = node[l];return;}for(int i = node[l].cnt + node[r].cnt;i;-- i) fa[i] = i, vis[i] = 0;node[o].wsize = node[l].wsize + node[r].wsize;node[o].bsize = node[l].bsize + node[r].bsize;for(int i = 1;i <= n;++ i)if(g[node[l].r][i] == g[node[r].l][i]){int f1 = find(node[l].far[i]), f2 = find(node[r].fal[i] + node[l].cnt);if(f1 != f2){fa[f1] = f2;if(g[node[l].r][i]) -- node[o].bsize;else -- node[o].wsize;}}node[o].cnt = 0;for(int i = 1;i <= n;++ i){int f1 = find(node[l].fal[i]), f2 = find(node[r].far[i] + node[l].cnt);if(!vis[f1]) vis[f1] = ++ node[o].cnt;if(!vis[f2]) vis[f2] = ++ node[o].cnt;node[o].fal[i] = vis[f1], node[o].far[i] = vis[f2];}
}
void calc(int o)
{int wsize = 0, bsize = 0, pos = node[o].l, *fal = node[o].fal, *far = node[o].far;if(g[pos][1]) ++ bsize; else ++ wsize;fal[1] = far[1] = 1;for(int i = 2;i <= n;++ i){if(g[pos][i] != g[pos][i - 1])if(g[pos][i]) ++ bsize;else ++ wsize;fal[i] = far[i] = wsize + bsize;}node[o].cnt = wsize + bsize, node[o].wsize = wsize, node[o].bsize = bsize;
}
void build(int o = 1, int l = 1, int r = n)
{node[o].l = l, node[o].r = r;if(l == r){calc(o);return;}int mid = (l + r) >> 1;build(o << 1, l, mid);build(o << 1 | 1, mid + 1, r);pushup(o);
}
void modify(int p, int o = 1, int l = 1, int r = n)
{if(l == r){calc(o);return;}int mid = (l + r) >> 1;if(p <= mid) modify(p, o << 1, l, mid);else modify(p, o << 1 | 1, mid + 1, r);pushup(o);
}int main()
{read(n);for(register int i = 1;i <= n;++ i)for(register int j = 1;j <= n;++ j)read(g[i][j]);build();read(q);for(register int i = 1;i <= q;++ i){int tmp1, tmp2;read(tmp1), read(tmp2);g[tmp1][tmp2] ^= 1;modify(tmp1);printf("%d %d\n", node[1].bsize, node[1].wsize);}return 0;
}

转载于:https://www.cnblogs.com/huibixiaoxing/p/8599072.html

BZOJ1453: [Wc]Dface双面棋盘相关推荐

  1. BZOJ1453: [WC2005]Dface双面棋盘

    离线LCT维护MST,和3082的方法一样.然而比较码农,适合颓废的时候写. PS:线段树分治要好写得多,LCT比较自娱自乐. #include<bits/stdc++.h> using ...

  2. [WC2005]双面棋盘,洛谷P4121,线段树分治+可撤销并查集

    正题 这题主要是来练手的,因为没写过可撤销的并查集,大概就是把每一个格子看成一个点,然后格子直接的边有很多的出现区间,把这些出现区间和对应的颜色打到线段树上,然后用可撤销的并查集来维护就可以了. #i ...

  3. 2019年互联网公司月饼哪家强?阿里、百度、网易等14家中秋月饼盘点

    一年一度的中秋节日马上到来,"八月十五月儿圆,中秋月饼香又甜",没有月饼的中秋节是不完整的.而在互联网公司,月饼已然成为福利和文化的象征.特别是一些互联网大厂,在月饼设计上特别用心 ...

  4. 视网膜电图特征可以检测成人的抑郁状态和治疗反应:一种机器学习方法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 视网膜电图特征可以检测成人的抑郁状态和治疗反应:一种机器学习方法 摘要 1. 引言 2. 方法和材料 2.1 人口与伦理声明 2.2 ...

  5. 中秋快乐!2019年互联网公司月饼哪家强?

    作者:过往记忆大数据 来源:过往记忆大数据 一年一度的中秋节日马上到来,"八月十五月儿圆,中秋月饼香又甜",没有月饼的中秋节是不完整的.而在互联网公司,月饼已然成为福利和文化的象征 ...

  6. 2019年互联网公司月饼哪家强?

    作者:过往记忆大数据 来源:过往记忆大数据 一年一度的中秋节日马上到来,"八月十五月儿圆,中秋月饼香又甜",没有月饼的中秋节是不完整的.而在互联网公司,月饼已然成为福利和文化的象征 ...

  7. 月饼节快乐!2019腾讯、阿里、百度、京东、小米等互联网公司月饼大盘点

    2019年还剩下三分之一 今天迎来中国重要的传统节日 那就是"中秋节" 说到中秋节脑海里面第一想到的 当然就是月饼了 "八月十五月儿圆,中秋月饼香又甜" 月饼象 ...

  8. 线段树专题-黑白棋盘 BZOJ-1453

    线段树专题-黑白棋盘 题目来源 BZOJ−1453BZOJ-1453BZOJ−1453 题意 QQQ次操作 每次操作给出(x,y)(x,y)(x,y),将(x,y)(x,y)(x,y)个格子颜色取反 ...

  9. 这是目录以下是本人认为wc的C++

    同理qt也一样!作者: 时间: 出处: 缩略图: 标题:index for wc solution内容: 这是目录以下是本人认为wc的C++可做题(即有意义的)ok表示2002:fence(ok) h ...

最新文章

  1. Vagrant: hostmanager 主机名管理插件
  2. 英特尔“包抄”英伟达:oneAPI对标CUDA、为《王者荣耀》云游戏提供GPU
  3. 使用vi/vim编辑时按ctrl-s后客户端假死解决方法
  4. 《2018区块链整体架构及应用》(PPT全文)
  5. Exchange安装过程中经常遇到的服务器需要重启问题
  6. 如何安装mysql5.7.15_ubuntu16.04安装mysql5.7.15
  7. [JS3] 立即执行JS
  8. linux多媒体功能,Ubuntu 8.04中文强化版 多媒体功能更强大
  9. yacc 简易计算机规则,Lex Yacc 学习笔记(2)- 简单计算器
  10. 2016年中国OTT盒子行业市场现状及发展前景分析
  11. 网页数据导出为Excel(带图片)
  12. Pywifi用法 - python
  13. Excel 从入门到精通免费视频教程-值得收藏
  14. Oracle12c使用AFD(Oracle ASM Filter Driver)特性部署集群的配置方法
  15. 编译原理中Follow集的求法
  16. spring boot 尚桂谷学习笔记05 ---Web
  17. 客户画像模型宽表搭建
  18. 第一次使用ENVI?ENVI入门手册收好!
  19. 大工16计算机应用基础2,大工20秋《计算机应用基础》在线测试2
  20. 3518E与3518C产品区别

热门文章

  1. linux用户操作的日志,linux 用户操作记录并录入日志
  2. 计算机二级c语言选择题范围,计算机二级C语言考点选择结构
  3. python逆向什么意思_如何理解python逆向切片
  4. php ci 框架 扩展缓存类,CodeIgniter扩展核心类实例详解
  5. event php,PHP event 事件机制
  6. 微机原理——移位指令
  7. 调试JavaScript代码
  8. js isinteger_在JavaScript中使用示例使用Number isInteger()方法
  9. java删除指定索引元素_将对象/元素添加到列表中的Java指定索引处
  10. 如何输入一个整数逆序输出_如何匹配DSP输入输出信号