有一个 \(n \times m\) 矩阵,初态下全是 \(0\)。

如果两个相邻元素(四连通)相等,我们就说它们是连通的,且这种关系可以传递。

有 \(q\) 次操作,每次指定一个位置 \((x_i,y_i)\) 把它替换为 \(c_i\)。

每次操作后求这个矩阵有多少个连通块。

\(q \leq 2\times 10^6\), \(n,m \leq 300\)

Solution

带删除的并查集问题可以离线,所以正着倒着各做一次,然后将答案做差就可以了

考虑正着做的过程,刚开始就是一块 \(0\) 的板板

每次我们创建一个新节点,然后试图将它与周围的节点合并,设合并的次数为 \(t\),那么这一次对答案的贡献(即这次操作新增了多少个连通块)就是 \(1-t\)

反向操作时同理,贡献带个负号就可以了

最后输出答案的时候,把贡献数组求个前缀和即可

#include <bits/stdc++.h>
using namespace std; const int N = 305, M = 2000005;
int a[N][N],n,m,q,ind,num,f[M*2],ans[M],id[N][N]; struct query {
int x,y,b,c;
} s[M]; int find(int x) {return (x==f[x])?x:f[x]=find(f[x]);}
void merge(int x,int y) {if((x=find(x))-(y=find(y))) f[x]=y,--num;} void solve(int x,int y) {
if(a[x][y]==a[x-1][y]) merge(id[x][y],id[x-1][y]);
if(a[x][y]==a[x+1][y]) merge(id[x][y],id[x+1][y]);
if(a[x][y]==a[x][y-1]) merge(id[x][y],id[x][y-1]);
if(a[x][y]==a[x][y+1]) merge(id[x][y],id[x][y+1]);
} signed main() {
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=q;i++) {
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
s[i]={x,y,a[x][y],c};
a[x][y]=c;
}
memset(a,0xff,sizeof a);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=0;
for(int i=1;i<=q;i++) {
if(s[i].b!=s[i].c) {
int x=s[i].x,y=s[i].y,b=s[i].b,c=s[i].c;
num=1;
a[x][y]=c;
id[x][y]=++ind;
f[ind]=ind;
solve(x,y);
ans[i]+=num;
}
}
ind=0;
memset(f,0,sizeof f);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) {
id[i][j]=++ind;
f[ind]=ind;
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) solve(i,j);
for(int i=q;i>=1;--i) {
if(s[i].b!=s[i].c) {
int x=s[i].x,y=s[i].y,b=s[i].c,c=s[i].b;
num=1;
a[x][y]=c;
id[x][y]=++ind;
f[ind]=ind;
solve(x,y);
ans[i]-=num;
}
}
ans[0]=1;
for(int i=1;i<=q;i++) ans[i]+=ans[i-1];
for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
}

[CF1303F] Number of Components - 并查集,时间倒流的更多相关文章

  1. CF-292D Connected Components 并查集 好题

    D. Connected Components 题意 现在有n个点,m条编号为1-m的无向边,给出k个询问,每个询问给出区间[l,r],让输出删除标号为l-r的边后还有几个连通块? 思路 去除编号为[ ...

  2. 并查集+时光倒流 || [JSOI2008]星球大战starwar || BZOJ 1015 || Luogu P1197

    题面:P1197 [JSOI2008]星球大战 题解: 坑点有点多啊,加上我本来就有点头昏脑涨,一道水题写了一万年.. 并查集不支持拆开(但是可以撤销合并),只支持合并.所以把询问离线了,从最后状态到 ...

  3. hihocoder 1066 无间道之并查集

    #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息……额,说远了,总之,小Hi和小H ...

  4. [hihoCoder]无间道之并查集

    题目大意: #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息……额,说远了,总之, ...

  5. acm专题--并查集

    题目来源:http://hihocoder.com/problemset/problem/1066 #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256M ...

  6. 【BZOJ 4025】 (CDQ?还是整体二分?+并查集及它的恢复操作)

    4025: 二分图 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考 ...

  7. POJ2985 The k-th Largest Group (并查集+treap)

    Newman likes playing with cats. He possesses lots of cats in his home. Because the number of cats is ...

  8. hiho #1066 : 无间道之并查集

    #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息……额,说远了,总之,小Hi和小H ...

  9. HihoCoder第十四周:无间道之并查集

    #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息--额,说远了,总之,小Hi和小H ...

随机推荐

  1. k8s 安装ELK(6.7.0版本)和EFK

    一.Elasticsearch安装 helm安装的也行,而且helm安装的stable/elasticsearch可用性更高,但是使用资源更多. 1.安装elasticsearch(线上环境千万记得把 ...

  2. 兄弟连 企业shell笔试题 16-31

    企业实践题16:企业案例:写网络服务独立进程模式下rsync的系统启动脚本 例如:/etc/init.d/rsyncd{start|stop|restart} .要求:1.要使用系统函数库技巧.2.要 ...

  3. 记一次MySQL中Waiting for table metadata lock的解决方法

    最近项目中的数据库查询经常挂起,应用程序启动后也报操作超时.测试人员就说数据库又挂了(貌似他们眼中的连接失败,查询无果都是挂了),通过 show processlist 一看,满屏都是 Waiting ...

  4. apache 访问状态 分析

    状态查看: 1.查看apache 各状态连接数 [root]#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' ...

  5. LVM知识梳理

    1 LVM介绍 LVM即logical volume manager逻辑卷管理,其主要特点是:可以动态地扩大和缩小分区大小,但前提是分区的文件系统必须是LVM格式的,lvm的实现需要安装lvm2软件包 ...

  6. shell脚本自动备份MySQL数据库

    脚本如下: #!/bin/bash #数据库IP dbserver='127.0.0.1' #数据库用户名 dbuser='root' #数据密码 dbpasswd=' #数据库,如有多个库用空格分开 ...

  7. 阿里云ECS服务器,mysql无法外网访问

    可参考https://www.jianshu.com/p/7a41734b502e 问题原因 未授权远程IP地址登录.root用户默认只能在localhost也就是本机登录 解决方案 在服务器上登录数 ...

  8. this关键字和static关键字

    this关键字 普通方法中,this总是指向调用该方法的对象. 构造方法中,this总是指向正要初始化的对象. this区分成员变量和全局变量的作用,在当前类中可以省略. this的常用方法: 让类中 ...

  9. go程序基于阿里云CodePipeline的一次devops实践

    背景 最近朋友有个项目代码托管用的码云,测试服务器(阿里云ECS)只有一台,三四个人开发,于是想基于阿里云的CodePipeline快速打造一套自动化cicd的流程,使用docker来进行多套环境部署 ...

  10. 工作五年的.neter的一些经历感想和对未来的一些疑惑

    本次疫情在家办公快一个月了,节省了上下班的时间,外出活动时间,感觉有好多时间可以利用.人一闲下来就容易想事情,很多事情想不通心里堵的厉害,做事都提不起兴趣.至于想些什么呢,我给大家摆一下. 我的经历 ...