线段树+并查集维护连通性。

好像 \(700ms\) 的时限把我的常数超级大的做法卡掉了, 必须要开 \(O_2\) 才行。

对于线段树的每一个结点都开左边的并查集,右边的并查集,然后合并。

\(Code\ Below:\)

#include <bits/stdc++.h>
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace std;
const int maxn=200+10;
int n,m,a[maxn][maxn],f[maxn<<2],tmp[maxn<<2],wsum[maxn<<2],bsum[maxn<<2],lfa[maxn<<2][maxn],rfa[maxn<<2][maxn]; inline int read(){
register int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
} int find(int x,int *f){
return (x==f[x])?x:f[x]=find(f[x],f);
} inline void pushup(int rt,int mid){
wsum[rt]=wsum[lson]+wsum[rson];
bsum[rt]=bsum[lson]+bsum[rson];
for(int i=1;i<=n;i++){
f[i]=lfa[lson][i];f[i+n]=rfa[lson][i];
f[i+2*n]=lfa[rson][i]+2*n;f[i+3*n]=rfa[rson][i]+2*n;
}
for(int i=1;i<=n;i++)
if(a[mid][i]==a[mid+1][i]){
if(find(i+n,f)!=find(i+2*n,f)){
f[find(i+n,f)]=f[find(i+2*n,f)];
if(a[mid][i]==0) wsum[rt]--;
else bsum[rt]--;
}
}
for(int i=1;i<=n;i++) tmp[find(i,f)]=i;
for(int i=3*n+1;i<=4*n;i++) tmp[find(i,f)]=i-2*n;
for(int i=1;i<=n;i++){
lfa[rt][i]=tmp[find(i,f)];
rfa[rt][i]=tmp[find(i+3*n,f)];
}
} void build(int l,int r,int rt){
if(l == r){
for(int i=1;i<=n;i++) lfa[rt][i]=i;
for(int i=1;i<=n;i++){
if(a[l][i]==0) wsum[rt]++;
else bsum[rt]++;
if(a[l][i-1]==a[l][i]){
lfa[rt][find(i-1,lfa[rt])]=i;
if(a[l][i]==0) wsum[rt]--;
else bsum[rt]--;
}
rfa[rt][i]=lfa[rt][i];
}
return ;
}
int mid=(l+r)>>1;
build(l,mid,lson);
build(mid+1,r,rson);
pushup(rt,mid);
} void modify(int x,int l,int r,int rt){
if(l == r){
wsum[rt]=bsum[rt]=0;
for(int i=1;i<=n;i++) lfa[rt][i]=i;
for(int i=1;i<=n;i++){
if(a[l][i]==0) wsum[rt]++;
else bsum[rt]++;
if(a[l][i-1]==a[l][i]){
lfa[rt][find(i-1,lfa[rt])]=i;
if(a[l][i]==0) wsum[rt]--;
else bsum[rt]--;
}
rfa[rt][i]=lfa[rt][i];
}
return ;
}
int mid=(l+r)>>1;
if(x <= mid) modify(x,l,mid,lson);
else modify(x,mid+1,r,rson);
pushup(rt,mid);
} int main()
{
n=read();
for(int i=1;i<=n;i++) a[i][0]=-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) a[i][j]=read();
build(1,n,1);
m=read();
int x,y;
while(m--){
x=read(),y=read();
a[x][y]^=1;modify(x,1,n,1);
printf("%d %d\n",bsum[1],wsum[1]);
}
return 0;
}

[WC2005]双面棋盘(线段树+并查集)的更多相关文章

  1. 【BZOJ1453】[Wc]Dface双面棋盘 线段树+并查集

    [BZOJ1453][Wc]Dface双面棋盘 Description Input Output Sample Input Sample Output HINT 题解:话说看到题的第一反应其实是LCT ...

  2. 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)

    2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...

  3. codeforces 811E Vladik and Entertaining Flags(线段树+并查集)

    codeforces 811E Vladik and Entertaining Flags 题面 \(n*m(1<=n<=10, 1<=m<=1e5)\)的棋盘,每个格子有一个 ...

  4. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  5. 【XSY2707】snow 线段树 并查集

    题目描述 有\(n\)个人和一条长度为\(t\)的线段,每个人还有一个工作范围(是一个区间).最开始整条线段都是白的.定义每个人的工作长度是这个人的工作范围中白色部分的长度(会随着线段改变而改变).每 ...

  6. bzoj 2054: 疯狂的馒头(线段树||并查集)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2054 线段树写法: 点的颜色只取决于最后一次染的颜色,所以我们可以倒着维护,如果当前区间之前 ...

  7. 【CF687D】Dividing Kingdom II 线段树+并查集

    [CF687D]Dividing Kingdom II 题意:给你一张n个点m条边的无向图,边有边权$w_i$.有q个询问,每次给出l r,问你:如果只保留编号在[l,r]中的边,你需要将所有点分成两 ...

  8. 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]

    Vladik and Entertaining Flags Time Limit: 20 Sec  Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...

  9. 【BZOJ 4662】 4662: Snow (线段树+并查集)

    4662: Snow Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 136  Solved: 47 Description 2333年的某一天,临冬突 ...

随机推荐

  1. HTML5基础实例

    <!DOCTYPE html> <!--声明HTML文档--> <html> <head> <title>我的网页</title> ...

  2. 在ugui上显示3d物体

    1.接下来,使Cube的Layer和背景一样为UI层, 2.在将我们的主相机culling Mask改为UI,如果你还想渲染其他层的物体,可以根据需要该为需要的层,或者直接改为Everyting 3. ...

  3. dex2jar 和 jd-gui 的安装与使用(转)

    出处:https://blog.csdn.net/katrinawj/article/details/80016315 将APK直接解压(修改后缀名为.zip,然后解压)后,可以看到目录下包含一个cl ...

  4. tomcat7 安装 windows 服务

    tomcat 可以安装成windows 服务,这样 每次启动就不需要启动tomcat了. 具体配置: 1.修改 service.bat 在行首添加 set "JAVA_HOME=E:\jdk ...

  5. vue中使用promise.all发送多个请求

    1.创建两个promise,在promise中使用axios 2.调用Promise.all([p1,p2]).then(res=>{}).catch(err=>{})方法 代码如下: & ...

  6. illustrator画梯形

    1.在空白文档上先绘制出一个长方形: 2.用鼠标点击工具箱中”自由变换“工具: 3.用鼠标指向长方形四个顶点中的任意一个,当鼠标的箭头变为相反反方向的双箭头时,再按住鼠标左键不要松手, 同时按住[sh ...

  7. Spring Boot 入门实践

    一.Eclipse配置Spring Boot环境 1.查看eclipse版本信息: 2.登录:http://spring.io/tools/sts/all 看eclipse对应的插件版本对应的ecli ...

  8. mysql order by 中文 排序

    mysql order by 中文 排序 1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都 ...

  9. README.md 编写

    Spring Boot Demo =========================== 该文件用来测试和展示书写README的各种markdown语法.GitHub的markdown语法在标准的ma ...

  10. oracle 操作,偶尔记一下

    一.根据更新时间排序 1.插入insert into t_user t (t.user_id,t.user_name,t.create_time,t.update_time)values('10',' ...