题目大意:

一个黑白方格图

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

思路:

可以把每一行压为一个点

使用线段树来维护

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

 #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. Getting start with dbus in systemd (03) - sd-bus.h 使用例子 (systemd version>=221)

    sd-bus.h 例子 注意: sd-dbus 是systemd提供的lib,但是这个lib,只有在systemd>v221版本后才可以使用,centos 219版本太低,所以不能使用. 参考: ...

  2. 通过HTTP的HEADER完成各种骚操作

    作为一名专业的切图工程师,我从来不care网页的header,最多关心Status Code是不是200.但是HEADER真的很重要啊,客户端从服务器端获取内容,首先就是通过HEADER进行各种沟通! ...

  3. [HNOI]2003 消防局的建立

    消防局的建立 本题地址:http://www.luogu.org/problem/show?pid=2279 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料 ...

  4. 个人 NABCD

    失物招领APP个人NABCD Need: 在朋友圈中,QQZone中我们长仓可以看到失物招领这方面的信息,又没有学校中专门使用的失物招领平台,所以根据这个信息,决定开发一款解决这方面问题的APP来满足 ...

  5. java 使用OpenOffice文件实现预览

    1.安装OpenOffice软件 安装教程:https://jingyan.baidu.com/article/c275f6ba12c07ce33d756732.html 2.安装完成后,创建项目,p ...

  6. js中复制功能总结

    目前copy主流有四种方式:ZeroClipboard,Clipboard.js,execCommand,setData,clipboardData 概况: ZeroClipboard 就是常说的Fl ...

  7. ios 7以后 隐藏顶部状态栏

    iOS 7 以后,之前隐藏顶部状态栏的方法都已经失效.以下介绍的方法是全部兼容的. 修改xode工程里的 Info.plist 增加 Status bar is initially hidden一行, ...

  8. JavaSE 学习笔记之包装类(十七)

    基本数据类型对象包装类:是按照面向对象思想将基本数据类型封装成了对象. 好处: 1:可以通过对象中的属性和行为操作基本数据. 2:可以实现基本数据类型和字符串之间的转换. 关键字   对应的类名 by ...

  9. [USACO06JAN]牛的舞会The Cow Prom Tarjan

    题目描述 The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in their ...

  10. ECMAScript 6 入门学习笔记(二)——变量的解构赋值

    一.数组的解构赋值 let [foo, [[bar], baz]] = [1, [[2], 3]]; ①可多不可少,等号的右边是数组 let [x, y] = [1, 2, 3]; //可以 let ...