首页 > 其他分享 >CodeForces-690#D1 题解

CodeForces-690#D1 题解

时间:2022-12-27 20:02:36浏览次数:70  
标签:pii 690 set unio int 题解 CodeForces ret 1005

正文

很显然啊,这是在考一个叫连通块的东东,于是蒟蒻的我马上想到了连通块必备:并查集。

如果一个块四边连通了其它的块,那么合并这两个块。

当然,并查集要用二维的:

typedef pair<int,int> pii;
pii f[1005][1005];
void init(){//初始化并查集
	for(int i=1;i<=n;i++)	for(int j=1;j<=m;j++)
		f[i][j]={i,j};
}
pii fd(pii a){//查找根
	if(f[a.fi][a.sc]==a)	return a;
	return f[a.fi][a.sc]=fd(f[a.fi][a.sc]);
}
void unio(pii a,pii b){//合并a和b所在的集合
	f[a.fi][a.sc]=fd(b);
}

最后就是查重,这里我用了手打的哈希表 set

遍历并查集数组,将每个子节点的根节点放入 set,去重,最后看 set 的元素数就可以。

struct set{
	int s[1000005];
	void insert(pii a){
		s[a.fi*105+a.sc]++;
	}
	int size(){
		int ret=0;
		for(int &i:s)
			if(i)	ret++;
		return ret;
	}
};

最后综合:

#include<iostream>
#include<bits/stl_pair.h>
#define fi first
#define sc second
using namespace std;
typedef pair<int,int> pii;
pii f[1005][1005];
int n,m;
char a[1005][1005];
struct set{
	int s[1000005];
	void insert(pii a){
		s[a.fi*105+a.sc]++;
	}
	int size(){
		int ret=0;
		for(int &i:s)
			if(i)	ret++;
		return ret;
	}
};
set s;
void init(){
	for(int i=1;i<=n;i++)	for(int j=1;j<=m;j++)
		f[i][j]={i,j};
}
pii fd(pii a){
	if(f[a.fi][a.sc]==a)	return a;
	return f[a.fi][a.sc]=fd(f[a.fi][a.sc]);
}
void unio(pii a,pii b){
	f[a.fi][a.sc]=fd(b);
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0);
	cin>>n>>m;
	init();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]=='.')	continue;
			if(a[i-1][j]=='B')	unio({i-1,j},{i,j});
			if(a[i+1][j]=='B')	unio({i+1,j},{i,j});
			if(a[i][j-1]=='B')	unio({i,j-1},{i,j});
			if(a[i][j+1]=='B')	unio({i,j+1},{i,j});
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(a[i][j]=='B')	s.insert(fd({i,j}));
	cout<<s.size();
}

完结!!

后附

日志

v1.0 on 2022.12.27: 发布

标签:pii,690,set,unio,int,题解,CodeForces,ret,1005
From: https://www.cnblogs.com/wanguan/p/17008864.html

相关文章

  • Codeforces Round #767 (Div. 2)C ,D
    CodeforcesRound#767(Div.2)C,DCC这一道题大意是给你一个数组,你可以选取任意长度的数组(连续),求出这个数组的mex,然后问我们你得到最大的字典序的mex是多少(我这里犯......
  • 【题解】1059: 贴瓷砖
    1059:贴瓷砖题目描述有一块大小是2*n的墙面,现在需要用2种规格的瓷砖铺满,瓷砖规格分别是2*1和2*2,请计算一共有多少种铺设的方法。输入输入的第一行包含一个......
  • P6357 题解
    Luogu题面题目描述给定一串长度为\(n\)的数字,数字为\(0\sim9\)之间的任意一个,下标从\(1\)记起。然后进行\(m\)次区间查询,每次查找区间\([l,r]\)的区间和,......
  • answerOpenCV轮廓类问题解析
    contour在opencv中是一个基础的数据结构,灵活运用的话,作用很大。以contour为关键字,在answerOpenCV中能够发现很多有趣的东西。 1、无法解决的问题​​......
  • 【题解】ABC283
    \(\text{AtCoderBeginnerContest283}\)APower无意义题,直接输出。BFirstQueryProblem无意义题,维护一个支持单点修改、单点查询的数据结构。(雾)CCashRegister......
  • Atcoder Beginner Contest ABC 283 Ex Popcount Sum 题解 (类欧几里得算法)
    题目链接令\(p=\lfloor\frac{n-r}m\rfloor\),则我们其实是要对所有\(0\lei\le29\)求\(\sum_{j=0}^p(\lfloor\frac{mj+r}{2^i}\rfloormod\2)\)。右边那个东西如果没......
  • 2022 International Collegiate Programming Contest, Jinan Site 部分题目简要题解
    从这里开始比赛目录傻逼学院负责人ProblemBTorch注意到$a_1,b_1,a_2,b_2$的和不会超过$10^6$考虑胖先生的周期开始的时候,瘦先生的周期在时......
  • Codeforces Global Round 14 C. Phoenix and Towers(思维)
    https://codeforces.com/contest/1515/problem/C题目大意:给定一个长度为n的序列a,ai表示方块的高度。每一个方块的高度都在1和q之间。让我们用这n个方块搭建m座塔,两两......
  • USACO22DEC青铜组题解
    T1:CowCollege总学费\(=\)设置的单人学费\(\times\)接受的奶牛数一旦固定单人学费,就能确定接受的奶牛数单人学费可以是哪些值?\(\{c_1,c_2,\cdots,c_n\}\)其中......
  • P3537 [POI2012]SZA-Cloakroom 题解
    题目大意有\(n\)件物品,每件物品有三个属性\(a_i,b_i,c_i(a_i<b_i)\)。再给出\(q\)个询问,每个询问由非负整数\(m,k,s\)组成,问是否能够选出某些物品使得:对......