[BZOJ1453]Dface双面棋盘
Description

Input

Output

Sample Input

Sample Output

HINT

线段树+并查集,暴力记录和更新一些信息,详情见代码注解。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline 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<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=2e2;
int map[N+10][N+10];
int ID[N*4+10],fa[N*4+10];
int n,m;
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
struct Segment{
#define ls (p<<1)
#define rs (p<<1|1)
struct AC{//线段树记录列数,struct内存储一个列区间的信息
int lcnt[N+10],rcnt[N+10]; //记录最左列和最右列每行所属联通块编号,如BBWWBB编号为1,1,2,2,3,3
int W,B,T; //记录白块(W),黑块(B)个数,T为lcnt[n]+rcnt[n]
int l,r;
void clear(){
l=r=W=B=T=0;
memset(lcnt,0,sizeof(lcnt));
memset(rcnt,0,sizeof(rcnt));
}
void init(int x){//单点暴力
B=W=0;
for (int i=1;i<=n;i++){
if (i==1||map[i][x]!=map[i-1][x]) map[i][x]?B++:W++;
lcnt[i]=rcnt[i]=B+W;
}
T=B+W;
}
}tree[N*4+10];
friend AC operator +(const AC &x,const AC &y){
AC z; z.clear();
z.l=x.l,z.r=y.r;
z.B=x.B+y.B;
z.W=x.W+y.W;
for (int i=1;i<=x.T+y.T;i++) fa[i]=i,ID[i]=0; //T的用处(优化)
for (int i=1,p1,p2;i<=n;i++){//把y的信息加上x.T,使它们为一个图
if (map[i][x.r]!=map[i][y.l]) continue;
if ((p1=find(x.rcnt[i]))!=(p2=find(y.lcnt[i]+x.T))){
fa[p2]=p1; //记得连向小的标号……
map[i][x.r]?z.B--:z.W--;
}
}
int Rank=0;
for (int i=1;i<=n;i++){//离散化
int p1=find(x.lcnt[i]),p2=find(y.rcnt[i]+x.T);
if (!ID[p1]) ID[p1]=++Rank;
if (!ID[p2]) ID[p2]=++Rank;
z.lcnt[i]=ID[p1];
z.rcnt[i]=ID[p2];
}
z.T=Rank;
return z;
}
void build(int p,int l,int r){
tree[p].l=l,tree[p].r=r;
if (l==r){
tree[p].init(l);
return;
}
int mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
tree[p]=tree[ls]+tree[rs];
}
void change(int p,int l,int r,int x){
if (l==r){
tree[p].init(l);
return;
}
int mid=(l+r)>>1;
if (x<=mid) change(ls,l,mid,x);
if (x>mid) change(rs,mid+1,r,x);
tree[p]=tree[ls]+tree[rs];
}
void work(){
int x=read(),y=read();
map[x][y]^=1;
change(1,1,n,y);
printf("%d %d\n",tree[1].B,tree[1].W);
}
}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]Dface双面棋盘的更多相关文章
- 【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 ...
- BZOJ1453: [Wc]Dface双面棋盘
Description Input Output Sample Input Sample Output HINT 线段树套并查集应该是比较好写的做法,时间复杂度为O(N^3+M*NlogN). #in ...
- BZOJ1453:[WC]Dface双面棋盘
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...
- BZOJ1453: [WC2005]Dface双面棋盘
离线LCT维护MST,和3082的方法一样.然而比较码农,适合颓废的时候写. PS:线段树分治要好写得多,LCT比较自娱自乐. #include<bits/stdc++.h> using ...
- [Wc]Dface双面棋盘()
题解: 一道维护奇怪信息的线段树... 我刚开始看了标签想的是删去图上一个点后求连通性 发现不会 于是退化成一般图支持删除 插入 维护连通性 发现有2两种做法 1.lct维护 按照结束顺序先后排序,给 ...
- 【刷题】BZOJ 1453 [Wc]Dface双面棋盘
Description Input Output Sample Input Sample Output HINT Solution 不强制在线的动态图问题,那就LCT了 类似二分图那道题目 对于四个方 ...
- P4121 [WC2005]双面棋盘
题目 P4121 [WC2005]双面棋盘 貌似是刘汝佳出的题目?? 做法 线段树维护并查集 线段树分治\(1\)~\(n\)行,我们要考虑维护的肯定是黑.白各自的联通块数量 考虑区间合并,其实就与中 ...
随机推荐
- 拷贝地图 CopyAndOverwriteMap()
private void CopyAndOverwriteMap() { //Get IObjectCopy interface IObjectCopy objectCopy = new Object ...
- 外排序 & 败者树 & 多路归并-学习
来来来,根据这篇文章,学一下败者树吧: http://blog.csdn.net/whz_zb/article/details/7425152 一.胜者树 胜者树的一个优点是,如果一个选手的值改变了, ...
- EJB学习(三)——java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to..
在上一篇博客介绍了怎样使用使用Eclipse+JBOSS创建第一个EJB项目,在这期间就遇到一个错误: Exception in thread "main" java.lang.C ...
- DICOM:再次剖析fo-dicom中DicomService的自己定义事件绑定
题记: 趁着<从0到1>大火的热潮,最近又一次翻阅了一遍<从一到无穷大>(这样是不是感觉整个非负数轴就圆满了^_^). 尽管作为科普类书籍.可是里面的内容还是比較深奥,幸亏有作 ...
- Codeforces Round #221 (Div. 2) D
有点郁闷的题目,给了2000ms,可是n,m的范围已经是5000了.5000 * 5000一般在别的OJ已经是超了2000ms,一開始不敢敲.看了下别人有n*m的潜逃循环,原来CF的机子如此的强大,一 ...
- Struts2框架起源
曾经也用过S2SH框架做过几个项目,都不是工作中的,学习WEB开发的时候接触的第一套框架也是S2SH,可是工作之后一直没实用到S2SH 框架进行开发. 感觉曾经用这个框架的时候根本没有深入去了解这个框 ...
- Linux(Ubuntu14.04)下Google Chrome / Chromium标题栏乱码问题
注:我使用的Linux发行版是Ubuntu 14.04,不同Linux发行版可能会有不同. 最近在使用Chromium的时候tab的标题栏中文显示乱码,在地址栏输入中文是同样时乱码,就像下图: 看起来 ...
- Chapter1-data access reloaded:Entity Framework(上)
本章包括以下几个部分: 1.DataSet and classic ADO.NET approach2.Object model approach3.Object/relational mismatc ...
- 简单的处理git add ,git commit,git push 脚本
创建脚本lazygit.sh #!/bin/bash # 一次性处理git提交 #branch_name=`git symbolic-ref --short -q HEAD` branch_name= ...
- 关于追踪qemu 源码函数路径的一个方法
这阵子一直在研究qemu 磁盘io路径的源码,发现直接看代码是意见非常低效率的事情,qemu是一个比较庞大的家伙(源码部分大概154MB,完全由C语言来完成),整个结构也都非常地复杂,所以从代码上研究 ...