Comet OJ - Contest #13-C2
Comet OJ - Contest #13-C2
又是一道并查集。最近做过的并查集的题貌似蛮多的。
思路
首先考虑,每次处理矩形只考虑从0变成1的点。这样我们的复杂度就控制在了\(O(nm)\)。
那么,我们考虑怎么维护每个点下一个0的位置。因为我们知道并查集是用来维护一些元素的相同关系。所以我们考虑使每个点的\(fa\)为这一行下一个0的位置。那么,当我们把一个点由0染成1时,将这个点和左边的点合并。我们就能保证当前这个点的\(fa\)就是下一个0的位置,同时还能保证自己的“儿子”的\(fa\)变成了新的下一个0的位置。
那么考虑怎么动态维护联通块。
再开一个并查集维护1的联通块。我们先让所有1都给答案加1。当两个1的联通块合并时,答案减1即可。
不需要管联通顺序,每次处理一个1,都把周围能合并的合并了。(这又是并查集另一个比较重要的性质。当你每次把能得到的关系都合并起来后,最后就能得到所有的关系)。
复杂度\(O(n m \alpha(n m)+n q)\)。(加上按秩合并)
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=1005;
int map[maxn][maxn],fa1[maxn][maxn],fa2[maxn*maxn],id[maxn][maxn],n,m,q,tot,ans;
char s[maxn];
int get1(int x,int y) {return (fa1[x][y]==y)?y:fa1[x][y]=get1(x,fa1[x][y]);}
void uni1(int x,int u,int v){fa1[x][get1(x,u)]=get1(x,v);}
int get2(int x){return (fa2[x]==x)?x:fa2[x]=get2(fa2[x]);}
void uni2(int u,int v){fa2[get2(u)]=get2(v);}
int dx[5]={0,1,-1,0,0};
int dy[5]={0,0,0,1,-1};
void mark(int x,int y) {//color (x,y)
id[x][y]=++tot;ans++;fa2[tot]=tot;
if(get1(x,y)!=get1(x,y+1))uni1(x,y,y+1);
for(int i=1;i<=4;i++) {
int nx=x+dx[i],ny=y+dy[i];
if(1<=nx<=n&&1<=ny<=m&&id[nx][ny]) {
if(get2(id[nx][ny])!=get2(id[x][y])){uni2(id[nx][ny],id[x][y]);ans--;}
}
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%s",s+1);
for(int j=1;j<=m;j++)map[i][j]=(s[j]=='1')?1:0;
}
for(int i=1;i<=n;i++)for(int j=1;j<=m+1;j++)fa1[i][j]=j;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(map[i][j])mark(i,j);
scanf("%d",&q);
for(int t=1;t<=q;t++) {
int d[5];scanf("%d%d%d%d",&d[1],&d[3],&d[2],&d[4]);//x1 x2 y1 y2
for(int i=d[1];i<=d[2];i++) {
for(int j=get1(i,d[3]);j<=d[4];j=get1(i,j)) {
mark(i,j);
}
}
printf("%d\n",ans);
}
return 0;
}

Comet OJ - Contest #13-C2的更多相关文章
- Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」
来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...
- Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)
来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...
- Comet OJ Contest #13 D
Comet OJ Contest #13 D \(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} a^{i} b^{n- ...
- Comet OJ Contest #13 简要题解
C2 首先用并查集维护\(1\)的连通块,然后用另外一个并查集维护第\(i\)行中,第\(j\)列之后的第一个\(0\)的位置,就是如果当前位置是\(1\)那么它的父亲是它右边的格子,否则是它自己. ...
- Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(困难版) 并查集
题意 给一个$ n \times m$ 的网格,每个格子里有一个数字,非 \(0\) 即 \(1\),行从上往下依次编号为 \(1, 2, \cdots, n\),列从左往右依次编号为 \(1, 2, ...
- Comet OJ - Contest #13
Rank53. 第一次打这种比赛.还是有不少问题的,以后改吧. A题WA了两次罚了不少时. C写到一半发现只能过1,就先弃了. D一眼没看出来.第二眼看出来就是一个类似于复数的快速幂. 然后B切了. ...
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
- Comet OJ - Contest #2简要题解
Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...
- Comet OJ - Contest #4--前缀和
原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
随机推荐
- bootstrap中的col-md-*
一句话概括,就是根据显示屏幕宽度的大小,自动的选用对应的类的样式 1.col是column简写:列 2.xs是maxsmall简写:超小, sm是small简写:小, md是medium简写:中等, ...
- Kubernetes 弹性伸缩全场景解析(三) - HPA 实践手册
在上一篇文章中,给大家介绍和剖析了 HPA 的实现原理以及演进的思路与历程.本文我们将会为大家讲解如何使用 HPA 以及一些需要注意的细节. autoscaling/v1 实践 v1 的模板可能是大家 ...
- ASP.NET web.config 配置里部分参数详细说明
Session配置 <!-- <identity impersonate = "false" [true|false] userName = "" ...
- .net core 3.0中的Json API
在.net core 3.0中,内置了一套新的json api,主要用于去除asp.net core对json.net的依赖,同时也提供了更好的性能(直接处理 UTF-8,而无需转码到 UTF-16) ...
- 2019前端UI框架排行榜
一.Mint UI 流行指数:★★★★ Mint UI是 饿了么团队开发基于 Vue.js 的移动端UI框架,它包含丰富的 CSS 和 JS 组件,能够满足日常的移动端开发需要. 官网:https:/ ...
- 2019年JVM最新面试题,必须收藏它
1.JVN内存结构 方法区和对是所有线程共享的内存区域:而java栈.本地方法栈和程序员计数器是运行是线程私有的内存区域. Java堆(Heap),是Java虚拟机所管理的内存中最大的一块.Java堆 ...
- Spring循环依赖原因及如何解决
浅谈Spring解决循环依赖的三种方式 SpringBoot构造器注入循环依赖及解决 原文:https://www.baeldung.com/circular-dependencies-in-spri ...
- 基于rtmp+nginx 、vlc实现FFmpeg推流与wpf端拉流
这周在研究基于rtmp+nginx直播流的实现,现总结如下: 0.所需文件: 链接:https://pan.baidu.com/s/1U5gsNI8Rcl684l5gVL6swg 提取码:dli9 1 ...
- centos7 安装gitlab及简单配置
1.安装 wget -O gitlab.rpm https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-11.11.3 ...
- Spring(005)-多环境Profile
多个环境下的配置应该怎么进行,比如数据库连接字符,多个环境不同,spring的方案,大概总结如下. 例子,数据库配置. 定义一个获取数据库链接的接口 public interface DataConn ...