题目大意:

一个黑白方格图

支持单点修改 查询黑色与白色联通快个数

思路:

可以把每一行压为一个点

使用线段树来维护

然后两行合并的时候使用并查集来合并

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define inf 2139062143
#define MAXN 220
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) x=x*+ch-'',ch=getchar();
return x*f;
}
int n,g[MAXN][MAXN],f[MAXN<<],t[MAXN<<];
int find(int x) {return f[x]==x?x:f[x]=find(f[x]);}
struct data {int ans[],m[MAXN<<];}tr[MAXN<<];
void solve(int k,int p)
{
tr[k].ans[g[p][]]=,tr[k].ans[g[p][]^]=,tr[k].m[]=tr[k].m[+n]=;
for(int i=,j=;i<=n;i++)
{
if(g[p][i]!=g[p][j]) tr[k].ans[g[p][i]]++,j=i;
tr[k].m[i]=tr[k].m[i+n]=j;
}
}
void upd(int k,int p)
{
tr[k].ans[]=tr[k<<].ans[]+tr[k<<|].ans[];
tr[k].ans[]=tr[k<<].ans[]+tr[k<<|].ans[];
//cout<<k<<" "<<p<<endl;
for(int i=;i<=n*;i++) f[i]=tr[k<<].m[i];
//for(int i=1;i<=n*2;i++) cout<<i<<" "<<f[i]<<" "<<tr[k<<1].m[i]<<endl;
for(int i=;i<=n*;i++) f[i+n*]=tr[k<<|].m[i]+n*;
//cout<<f[1]<<" "<<f[2]<<endl;
for(int i=;i<=n;i++) if(g[p][i]==g[p+][i]&&find(i+n)!=find(i+n*))tr[k].ans[g[p][i]]--,f[f[i+n]]=f[i+n*];
for(int i=;i<=n*;i++)
{
f[i]=find(i);
if(i>n*) t[f[i]]=i-n*;
}
for(int i=;i<=n;i++) tr[k].m[i]=i;
for(int i=;i<=n;i++) tr[k].m[i+n]=t[f[i+n*]];
}
void build(int k,int l,int r)
{
if(l==r) {solve(k,l);return;}
int mid=(l+r)>>;
build(k<<,l,mid),build(k<<|,mid+,r);
upd(k,mid);
}
void mdf(int k,int l,int r,int x)
{
if(l==r) {solve(k,l);return;}
int mid=(l+r)>>;
if(x<=mid) mdf(k<<,l,mid,x);
else mdf(k<<|,mid+,r,x);
upd(k,mid);
}
int main()
{
n=read();int a,b;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) g[i][j]=read();
build(,,n);
int T=read();
while(T--) a=read(),b=read(),g[a][b]^=,mdf(,,n,a),printf("%d %d\n",tr[].ans[],tr[].ans[]);
}

bzoj 1453 双面棋盘的更多相关文章

  1. bzoj 1453: [Wc]Dface双面棋盘

    1453: [Wc]Dface双面棋盘 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 617  Solved: 317[Submit][Status][ ...

  2. 【BZOJ1453】[Wc]Dface双面棋盘 线段树+并查集

    [BZOJ1453][Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解:话说看到题的第一反应其实是LCT ...

  3. P4121 [WC2005]双面棋盘

    题目 P4121 [WC2005]双面棋盘 貌似是刘汝佳出的题目?? 做法 线段树维护并查集 线段树分治\(1\)~\(n\)行,我们要考虑维护的肯定是黑.白各自的联通块数量 考虑区间合并,其实就与中 ...

  4. 【刷题】BZOJ 1453 [Wc]Dface双面棋盘

    Description Input Output Sample Input Sample Output HINT Solution 不强制在线的动态图问题,那就LCT了 类似二分图那道题目 对于四个方 ...

  5. bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link

    2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 255  Solved: 77[Submit][Status] ...

  6. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  7. bzoj 1057: [ZJOI2007]棋盘制作 单调栈

    题目链接 1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 1019[Submit] ...

  8. BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )

    对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) ...

  9. 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作

    题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...

随机推荐

  1. 05JavaScript中的事件处理

    JavaScript中的事件处理 在JavaScript中,事件的发生主要是由窗口中内容变化.键盘和鼠标引起的.JavaScript在某些事件发生的时候,可以通过一些相应的事件处理器来捕获这些事件,并 ...

  2. cgroup代码浅析(1)

    前置:这里使用的linux版本是4.8,x86体系. cgroup_init_early(); 聊这个函数就需要先了解cgroup. cgroup概念 这个函数就是初始化cgroup所需要的参数的.c ...

  3. SAS,SATA普及文档

    目前所能见到的硬盘接口类型主要有IDE.SATA.SCSI.SAS.FC等等. IDE是俗称的并口,SATA是俗称的串口,这两种硬盘是个人电脑和低端服务器常见的硬盘.SCSI是"小型计算机系 ...

  4. you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varchar(255), sort integer not null

    you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version ...

  5. block相关归纳

    经过今天的Block的学习.上网查询相关文章归纳了一下 一.一个使用Block的好处有: Block可以用在许多不同的环境中,这样可以让代码更加简单,以及减少函数声明的数量,不用实现代理协议. 简单性 ...

  6. 关于ISIS协议 CSNP报文的周期更新理解

    为何ISIS协议的CSNP报文在MA网络环境中是以周期更新然而在P2P网络环境中只更新一次? 个人通过视频及资料学习理解: 我们知道ISIS的CSNP报文类似OSPF中的DBD报文,作用就是用来确认彼 ...

  7. Linux下常用的操作

    Linux下常用的操作 文件定位 locate filename 有些版本的linux会出现 -bash: locate: command not found错误,不要慌,安装一下mlocate包就好 ...

  8. python爬虫28 | 你爬下的数据不分析一波可就亏了啊,使用python进行数据可视化

    通过这段时间 小帅b教你从抓包开始 到数据爬取 到数据解析 再到数据存储 相信你已经能抓取大部分你想爬取的网站数据了 恭喜恭喜 但是 数据抓取下来 要好好分析一波 最好的方式就是把数据进行可视化 这样 ...

  9. asp.net mvc 4.0 新特性之移动特性

    asp.net mvc 4.0 新特性之移动特性 为不同的客户端提供不同的视图 手动重写 UserAgent,从而强制使用对应的视图 示例1.演示如何为不同的客户端提供不同的视图Global.asax ...

  10. hdu 2647拓扑排序 容器

    #include<stdio.h> #include<queue> #include<vector> #include<iostream> using ...