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\)行,我们要考虑维护的肯定是黑.白各自的联通块数量 考虑区间合并,其实就与中 ...
随机推荐
- Angular1.0路由的Hashbang和HTML5模式
原文答主jupiter http://stackoverflow.com/questions/16677528/location-switching-between-html5-and-hashban ...
- mvc 各种返回值
一个例子胜过千言万语,直接上代码 SpringMVC的Controller控制器返回值详解 SpringMVC Controller 返回值几种类型 Spring MVC 更灵活的控制 json 返回 ...
- whl文件下载
到哪找.whl文件?http://www.lfd.uci.edu/~gohlke/pythonlibs/
- NVR硬件录像机web无插件播放方案功能实现之相关接口注意事项说明
该篇博文主要用来说明EasyNVR硬件录像回放版本的相关接口说明和调用的demo: 方便用户的二次开发和集成. 软件根目录会包含接口文档的,因此,本文主要是对一些特定接口的说明和接口实现功能的讲解以及 ...
- maven snapshot和release版本的区别(转)
在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次.我们知道,maven的依赖管理是基于版本管理的, ...
- 九度OJ 1072:有多少不同的面值组合? (计数)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3112 解决:1591 题目描述: 某人有8角的邮票5张,1元的邮票4张,1元8角的邮票6张,用这些邮票中的一张或若干张可以得到多少种不同的 ...
- c++标准库比较
1 GNU standard c++ library debian发行版中使用的c++标准库是GNU standard c++标准库. 2 Boost debian发行版中也是用了boost库,但是不 ...
- SSL:Ubuntu证书配置
CA证书的配置 Ubuntu上CA证书的配置可以通过工具ca-certificates来方便的进行.该工具默认是随Ubuntu安装的,如果没有可以通过下面的命令来安装: sudo apt-get in ...
- 我的Android进阶之旅------>Android如何通过自定义SeekBar来实现视频播放进度条
首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个PopupWindow窗口,窗口里面显示当前的播放时间.在Seek ...
- update module (更新模块)
[转自http://blog.csdn.net/zhongguomao/article/details/6712568] function module:更新程序必须用一个特殊的FM(update m ...