[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\)行,我们要考虑维护的肯定是黑.白各自的联通块数量 考虑区间合并,其实就与中 ...
随机推荐
- 如何把你的Windows PC变成瘦客户机
越来越多的用户开始使用vmware view 4.5来做为企业桌面虚拟化的平台,通过view,所有的管理工作都转移到数据中心,但是考虑到成本原因,很多人员还在使用PC机,有没有办法将PC机变成瘦客户机 ...
- 【深度探索c++对象模型】Function语义学之虚函数
虚函数的一般实现模型:每一个class有一个virtual table,内含该class中的virtual function的地址,然后每个object有一个vptr,指向virtual table. ...
- JVM原理及内存溢出
JVM原理及内存溢出
- VC++ error C1083 无法打开包括文件 fstream.h,iostream.h怎么办
1 如下图所示,VS中不支持iostream.h和fstream.h的说法 2 改成下面三行就可以编译通过了 #include<iostream> #include <fstre ...
- Idea 13 新建maven项目
1.此时生成的maven项目没有web文件夹 file→New Project→Maven→Next→GID.AID (NewDemo)→Next→ProjectName(NewDemo)→Finis ...
- hdu 5303 Delicious Apples
这道题贪心 背包 假设在走半圆之内能够装满,那么一定优于绕一圈回到起点.所以我们从中点将这个分开,那么对于每一个区间由于苹果数非常少,所以能够利用pos[x]数组记录每一个苹果所在的苹果树位置,然后将 ...
- 关于Scrum
最近某些产品经理发出下两周的工作计划的时候,喜欢带上sprint这个字眼,看上去貌似是要走敏捷开发这一套,只可惜,我觉得他表现出来的是对敏捷开发和Scrum一窍不通,甚至对软件开发流程都完全不清楚,居 ...
- The sandbox is not sync with the Podfile.lock
github下载的Demo,很多时候使用到CocoaPods,有的时候因为依赖关系或者版本问题不能编译运行. 出现 以下错误 The sandbox is not sync with the Podf ...
- soapUI系列之—-02 Groovy脚本常用方法
------Groovy脚本常用方法 1. 设置参数值:setPropertyValuea. 设置 project level property//set to project level prope ...
- Linux登录自动切换root账户与历史命令优化
1:当我们Linux系统优化完成,会使用oldboy用户远程连接CRT登录,每次连接都需要使用sudo su - 或者su - 输入密码登录,请问如何在CRT连接的时候自动的切换到root账户,(提示 ...