bzoj 1453 双面棋盘
题目大意:
一个黑白方格图
支持单点修改 查询黑色与白色联通快个数
思路:
可以把每一行压为一个点
使用线段树来维护
然后两行合并的时候使用并查集来合并
#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 双面棋盘的更多相关文章
- bzoj 1453: [Wc]Dface双面棋盘
1453: [Wc]Dface双面棋盘 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 617 Solved: 317[Submit][Status][ ...
- 【BZOJ1453】[Wc]Dface双面棋盘 线段树+并查集
[BZOJ1453][Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解:话说看到题的第一反应其实是LCT ...
- P4121 [WC2005]双面棋盘
题目 P4121 [WC2005]双面棋盘 貌似是刘汝佳出的题目?? 做法 线段树维护并查集 线段树分治\(1\)~\(n\)行,我们要考虑维护的肯定是黑.白各自的联通块数量 考虑区间合并,其实就与中 ...
- 【刷题】BZOJ 1453 [Wc]Dface双面棋盘
Description Input Output Sample Input Sample Output HINT Solution 不强制在线的动态图问题,那就LCT了 类似二分图那道题目 对于四个方 ...
- bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link
2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 255 Solved: 77[Submit][Status] ...
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
- bzoj 1057: [ZJOI2007]棋盘制作 单调栈
题目链接 1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2027 Solved: 1019[Submit] ...
- 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)) ...
- 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作
题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...
随机推荐
- 05JavaScript中的事件处理
JavaScript中的事件处理 在JavaScript中,事件的发生主要是由窗口中内容变化.键盘和鼠标引起的.JavaScript在某些事件发生的时候,可以通过一些相应的事件处理器来捕获这些事件,并 ...
- cgroup代码浅析(1)
前置:这里使用的linux版本是4.8,x86体系. cgroup_init_early(); 聊这个函数就需要先了解cgroup. cgroup概念 这个函数就是初始化cgroup所需要的参数的.c ...
- SAS,SATA普及文档
目前所能见到的硬盘接口类型主要有IDE.SATA.SCSI.SAS.FC等等. IDE是俗称的并口,SATA是俗称的串口,这两种硬盘是个人电脑和低端服务器常见的硬盘.SCSI是"小型计算机系 ...
- 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 ...
- block相关归纳
经过今天的Block的学习.上网查询相关文章归纳了一下 一.一个使用Block的好处有: Block可以用在许多不同的环境中,这样可以让代码更加简单,以及减少函数声明的数量,不用实现代理协议. 简单性 ...
- 关于ISIS协议 CSNP报文的周期更新理解
为何ISIS协议的CSNP报文在MA网络环境中是以周期更新然而在P2P网络环境中只更新一次? 个人通过视频及资料学习理解: 我们知道ISIS的CSNP报文类似OSPF中的DBD报文,作用就是用来确认彼 ...
- Linux下常用的操作
Linux下常用的操作 文件定位 locate filename 有些版本的linux会出现 -bash: locate: command not found错误,不要慌,安装一下mlocate包就好 ...
- python爬虫28 | 你爬下的数据不分析一波可就亏了啊,使用python进行数据可视化
通过这段时间 小帅b教你从抓包开始 到数据爬取 到数据解析 再到数据存储 相信你已经能抓取大部分你想爬取的网站数据了 恭喜恭喜 但是 数据抓取下来 要好好分析一波 最好的方式就是把数据进行可视化 这样 ...
- asp.net mvc 4.0 新特性之移动特性
asp.net mvc 4.0 新特性之移动特性 为不同的客户端提供不同的视图 手动重写 UserAgent,从而强制使用对应的视图 示例1.演示如何为不同的客户端提供不同的视图Global.asax ...
- hdu 2647拓扑排序 容器
#include<stdio.h> #include<queue> #include<vector> #include<iostream> using ...