BZOJ1453:[WC]Dface双面棋盘
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=1453
线段树维护行区间,每个结点只记录这个区间最上面一行和最下面一行每个格子在当前区间内的并查集情况,然后区间\(update\)的时候暴力合并就行了。因为除去最上面一行和最下面一行以外的格子都没有用,所以要保证并查集的代表元素是最上面一行或者最下面一行的。
时间复杂度:\(O(mnlogn)\)
空间复杂度:\(O(n^2)\)
代码如下:
#include <cstdio>
using namespace std;
int n,m;
int map[205][205];
int fa[805],tmp[805];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
int find(int x) {
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
struct segment_tree {
struct tree_node {
int cnt[2],f[405];
void init(int x) {
f[1]=f[n+1]=1;int top=1;
cnt[map[x][1]]=1,cnt[map[x][1]^1]=0;
for(int i=2;i<=n;i++) {
if(map[x][i]!=map[x][top])
cnt[map[x][i]]++,top=i;
f[i]=f[i+n]=top;
}
}
}tree[805];
void update(int p,int x) {
int ls=p<<1,rs=p<<1|1;
for(int i=1;i<=n<<1;i++) {
fa[i]=tree[ls].f[i];
fa[i+(n<<1)]=tree[rs].f[i]+(n<<1);
}
tree[p].cnt[0]=tree[ls].cnt[0]+tree[rs].cnt[0];
tree[p].cnt[1]=tree[ls].cnt[1]+tree[rs].cnt[1];
for(int i=1;i<=n;i++)
if(map[x][i]==map[x+1][i]&&find(i+n)!=find(i+(n<<1)))
tree[p].cnt[map[x][i]]--,fa[fa[i+n]]=fa[i+(n<<1)];
for(int i=1;i<=n<<2;i++) {
find(i);
if(i<=n)tmp[fa[i]]=i;
if(i>n*3)tmp[fa[i]]=i-n*2;
}
for(int i=1;i<=n;i++) {
tree[p].f[i]=tmp[fa[i]];
tree[p].f[i+n]=tmp[fa[i+3*n]];
}
}
void build(int p,int l,int r) {
if(l==r) {tree[p].init(l);return;}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
update(p,mid);
}
void change(int p,int l,int r,int pos) {
if(l==r) {tree[p].init(l);return;}
int mid=(l+r)>>1;
if(pos<=mid)change(p<<1,l,mid,pos);
else change(p<<1|1,mid+1,r,pos);
update(p,mid);
}
void work() {
int x=read(),y=read();
map[x][y]^=1;
change(1,1,n,x);
printf("%d %d\n",tree[1].cnt[1],tree[1].cnt[0]);
}
}T;
int main() {
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=read();
T.build(1,1,n);m=read();
for(int i=1;i<=m;i++)T.work();
return 0;
}
BZOJ1453:[WC]Dface双面棋盘的更多相关文章
- BZOJ1453: [Wc]Dface双面棋盘
Description Input Output Sample Input Sample Output HINT 线段树套并查集应该是比较好写的做法,时间复杂度为O(N^3+M*NlogN). #in ...
- 【BZOJ1453】[Wc]Dface双面棋盘 线段树+并查集
[BZOJ1453][Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解:话说看到题的第一反应其实是LCT ...
- bzoj 1453: [Wc]Dface双面棋盘
1453: [Wc]Dface双面棋盘 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 617 Solved: 317[Submit][Status][ ...
- 【BZOJ1453】[WC] Dface双面棋盘(LCT维护联通块个数)
点此看题面 大致题意: 给你一个\(n*n\)的黑白棋盘,每次将一个格子翻转,分别求黑色连通块和白色连通块的个数. \(LCT\)动态维护图连通性 关于这一部分内容,可以参考这道例题:[BZOJ402 ...
- [Wc]Dface双面棋盘()
题解: 一道维护奇怪信息的线段树... 我刚开始看了标签想的是删去图上一个点后求连通性 发现不会 于是退化成一般图支持删除 插入 维护连通性 发现有2两种做法 1.lct维护 按照结束顺序先后排序,给 ...
- 【刷题】BZOJ 1453 [Wc]Dface双面棋盘
Description Input Output Sample Input Sample Output HINT Solution 不强制在线的动态图问题,那就LCT了 类似二分图那道题目 对于四个方 ...
- BZOJ1453: [WC2005]Dface双面棋盘
离线LCT维护MST,和3082的方法一样.然而比较码农,适合颓废的时候写. PS:线段树分治要好写得多,LCT比较自娱自乐. #include<bits/stdc++.h> using ...
- [BZOJ1453]Dface双面棋盘
Description Input Output Sample Input Sample Output HINT 线段树+并查集,暴力记录和更新一些信息,详情见代码注解. #include<cm ...
- P4121 [WC2005]双面棋盘
题目 P4121 [WC2005]双面棋盘 貌似是刘汝佳出的题目?? 做法 线段树维护并查集 线段树分治\(1\)~\(n\)行,我们要考虑维护的肯定是黑.白各自的联通块数量 考虑区间合并,其实就与中 ...
随机推荐
- 有关SQL注入的知识
SQL注入攻击是非常令人讨厌的安全漏洞,是所有的web开发人员,不管是什么平台,技术,还是数据层,需要确信他们理解和防止的东西.不幸的是,开发人员往往不集中花点时间在这上面,以至他们的应用,更糟糕的是 ...
- 深入浅出Attribute(三)
约定: 1.”attribute”和”attributes”均不翻译 2.”property”译为“属性” 3.msdn中的原句不翻译 4.”program entity”译为”语言元素” Attri ...
- <二代測序> 下载 NCBI sra 文件
本文近期更新地址: http://blog.csdn.net/tanzuozhev/article/details/51077222 随着測序技术的不断提高.二代測序数据成指数增长. NCBI提供了S ...
- CentOS系统环境下安装MongoDB
(1)进入MongoDB下载中心:http://www.mongodb.org/downloads We recommend using these binary distributions (官方推 ...
- 解决:IOS viewDidAppear/viewWillAppear无法被调用
本文转载至 http://my.oschina.net/lvlove/blog/82264 原因: 苹果的文档是这样描述的: If the view belonging to a view con ...
- Eclipse如何删除插件
删除Eclipse安装的插件方法: help -> install new softWare -> what is already installed ->选中 要卸载的插件 -&g ...
- 偏函数应用 pfa
- Python解释器是单线程应用 IO 密集型 计算密集型 GIL global interpreter lock
[Python解释器是单线程应用] [任意时刻,仅执行一个线程] 尽管Python解释器中可以运行多个线程,但是在任意给定的时刻只有一个线程会被解释器执行. [GIL锁 保证同时只有一个线程运行] 对 ...
- (图解)Description Resource Path Location Type Java compiler level does not match the version of
Description Resource Path Location Type Java compiler level does not match the version of project 编译 ...
- FI 常用表
FI 常用表 GL部分:FAGLFLEXT(FMGLFLEXT) 总账汇总表 GLT0 旧总帐汇总表 SKA1 总账科目主记录 (科目表) ...