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

好像 \(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. 【C#】解析C#中JSON.NET的使用

    目录结构: contents structure [-] JSON.NET简介 Serializing and Deserializing JSON Json Convert Json Seriali ...

  2. Rest架构风格的实践(使用通用Mapper技术)

    1.根据用户 id 查询用户数据 1.1 controll控制器 @RequestMapping("restful/user") @Controller public class ...

  3. spring boot 实现mybatis拦截器

    spring boot 实现mybatis拦截器 项目是个报表系统,服务端是简单的Java web架构,直接在请求参数里面加了个query id参数,就是mybatis mapper的query id ...

  4. Cannot read property 'protocol' of undefined的原因和解决办法

    Cannot read property 'protocol' of undefined 原因:axios请求中的错误 1.请求地址写错了 2.没有引入http.js 3.引入http.js的时候,单 ...

  5. IntelliJ IDEA 2017版 Spring5最基本的bean例子创建

    一.简述         SpringBoot是基于spring框架之上的快速开发的框架.Spring4核心就是容器,容器提供了对bean的装配和管理.       spring依赖加载:       ...

  6. attachEvent方法绑定事件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. ng-show和ng-if的区别和使用场景

    一.ng-show(ng-hide)和ng-if都是控制标签的显示和隐藏,为什么angularjs会定义两个指令来供我们使用呢,不多多说肯定有各自的使用场景,接下来我们看哈实际原理: ng-show实 ...

  8. Sql Server用户名和登录名的关系总结

    以前经常被SQL Server中的用户名和登录名搞迷糊,因为用sa(登录名)就搞定一切东西了,当然这会存在一些安全隐患.网上的文章也貌似讲得很好,但还是不明白.今天决心把这个问题弄明白.mashall ...

  9. JVM、JRE,JDK

    JVM解释class     Java虚拟机,解释编译后的class文件给系统..java代码编译成 .class机器指令,就能在JVM运行了,直接到硬件执行,实现了跨平台,只要操作系统安装了JVM, ...

  10. (转)Memcache内存分配策略

    转自:http://hi.baidu.com/software_one/item/0a0a6712dc7a319899ce33e0 一.Memcache内存分配机制 关于这个机制网上有很多解释的,我个 ...