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 ...
随机推荐
- JavaScript 中实现 sleep
来自推特上 Windows 故障分析的笑话 图片来源:me.me 推上看到的笑话,Windows 故障分析的实现. 然后想起来 JavaScript 中如何实现这个 sleep() 函数让代码暂停指定 ...
- HTML `capture` 属性
file 类型的 <input> 除了调起系统的文件选择框外,还可通过指定 capture 属性来现场拍照或录制.配合 accept 属性,可实现更加便捷的文件获取. 比如想要录制一段视频 ...
- spring思想分析
摘要: EveryBody in the world should learn how to program a computer...because it teaches you how to th ...
- EXP-00083: 调用 EXFSYS.DBMS_EXPFIL_DEPASEXP.schema_info_exp 时出现前一问题
select owner,object_name,object_type,status from dba_objects where object_name = 'LT_EXPORT_PKG'; 如果 ...
- Java垃圾回收简介
Java关键术语 JavaAPI:一系列帮助开发者创建Java应用程序的封装好的库. Java 开发工具包 (JDK):一系列工具帮助开发者创建Java应用程序.JDK包含工具编译.运行.打包.分发和 ...
- 爬虫之pyquery库
官方文档:https://pyquery.readthedocs.io/en/latest/ PyQuery是一个强大又灵活的网页解析库.如果你觉得正则写起来太麻烦.BeautifulSoup语法太难 ...
- gulp-file-include 合并 html 文件
gulp-file-include 是 gulp 插件,它提供了一个 include 方法让我们可以像后端模板那样把公共部分的页面导入进来. 安装依赖包(包括了 gulp-file-include 和 ...
- buf.writeDoubleBE()函数详解
buf.writeDoubleBE(value, offset[, noAssert]) buf.writeDoubleLE(value, offset[, noAssert]) value {Num ...
- xfce 安装文泉驿字体
下载文泉驿字体 #拷贝字体到目录/usr/share/fonts/wqy#创建字体缓存 mkfontscale # 在当前目录下生成fonts.scale文件 mkfontdir # 在当前目录下生成 ...
- android从sdcard中读取bitmap
String sdcard_path=Environment.getExternalStorageDirectory().getCanonicalPath(); String file_path=sd ...