Coconuts HDU - 5925 (二维离散化求连通块的个数以及大小)
题目链接:
D - Coconuts
HDU - 5925
题目大意:首先是T组测试样例,然后给你n*m的矩阵,原先矩阵里面都是白色的点,然后再输入k个黑色的点。这k个黑色的点可能会使得原先白色的点分成多个联通块,然后问你白色联通块的个数和每一个连通块里面白色的点的个数。
具体思路:输入的点坐标比较大,但是个数比较小,所以离散化坐标就可以了。标记每一个整块里面的白色的点的个数就可以了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 2e5+;
const int maxm =+;
vector<ll>contx;
vector<ll>conty;// 注意开long long
int vis[maxm<<][maxm<<];
ll a[maxm<<],cnt;
ll Map[maxm<<][maxm<<];
int f[][]= {{,-,,},{,,,-}};
struct node
{
int x,y;
node() {}
node(int xx,int yy)
{
x=xx;
y=yy;
}
} q[maxn];
bool judge(int x,int y)
{
if(x>=&&y>=&&x<=contx.size()&&y<=conty.size())
return true;
return false;
}
void dfs(int x,int y)
{
cnt+=Map[x][y];
vis[x][y]=;
for(int i=; i<; i++)
{
int tx=x+f[][i];
int ty=y+f[][i];
if(judge(tx,ty)&&vis[tx][ty]==)
dfs(tx,ty);
}
}
int main()
{
int T,Case=;
scanf("%d",&T);
while(T--)
{
int n,m,tot;
scanf("%d %d",&n,&m);
memset(vis,,sizeof(vis));
memset(Map,,sizeof(Map));
contx.clear();
conty.clear();
scanf("%d",&tot);
contx.push_back();
conty.push_back();
contx.push_back(n);
conty.push_back(m); /// 先把四个角输进去
for(int i=; i<=tot; i++)
{
scanf("%d %d",&q[i].x,&q[i].y);
contx.push_back(q[i].x);
conty.push_back(q[i].y);
if(q[i].x->=)
contx.push_back(q[i].x-);
if(q[i].x+<=n)
contx.push_back(q[i].x+);
if(q[i].y->=)
conty.push_back(q[i].y-);
if(q[i].y+<=m)
conty.push_back(q[i].y+);
}
sort(contx.begin(),contx.end());
sort(conty.begin(),conty.end());
contx.erase(unique(contx.begin(),contx.end()),contx.end());
conty.erase(unique(conty.begin(),conty.end()),conty.end());
for(int i=; i<=tot; i++)
{
int t1=lower_bound(contx.begin(),contx.end(),q[i].x)-contx.begin()+;
int t2=lower_bound(conty.begin(),conty.end(),q[i].y)-conty.begin()+;
vis[t1][t2]=;
}
for(int i=; i<contx.size(); i++)
{
for(int j=; j<conty.size(); j++)
{
if(i>&&j>)
Map[i+][j+]=(contx[i]-contx[i-])*(conty[j]-conty[j-]);
else if(i>)
Map[i+][j+]=(contx[i]-contx[i-])*conty[j];
else if(j>)
Map[i+][j+]=contx[i]*(conty[j]-conty[j-]);
else
Map[i+][j+]=contx[i]*conty[j];
}
}
int num=;
for(int i=; i<=contx.size(); i++)
{
for(int j=; j<=conty.size(); j++)
{
if(vis[i][j])continue;
cnt=;
dfs(i,j);
a[++num]=cnt;
}
}
sort(a+,a+num+);
printf("Case #%d:\n",++Case);
printf("%d\n",num);
for(int i=; i<=num; i++)
{
if(i==)
printf("%lld",a[i]);
else
printf(" %lld",a[i]);
}
printf("\n");
}
return ;
}
Coconuts HDU - 5925 (二维离散化求连通块的个数以及大小)的更多相关文章
- Coconuts HDU - 5925 二维离散化 自闭了
TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams about eating. One day, ...
- hdu 3072 Intelligence System(Tarjan 求连通块间最小值)
Intelligence System Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- DFS入门之二---DFS求连通块
用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所 ...
- [C++]油田(Oil Deposits)-用DFS求连通块
[本博文非博主原创,均摘自:刘汝佳<算法竞赛入门经典>(第2版) 6.4 图] [程序代码根据书中思路,非独立实现] 例题6-12 油田(Oil Deposits,UVa572) 输入一个 ...
- HDU1241 Oil Deposits —— DFS求连通块
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 Oil Deposits Time Limit: 2000/1000 MS (Java/Othe ...
- UVA 572 Oil Deposits油田(DFS求连通块)
UVA 572 DFS(floodfill) 用DFS求连通块 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format: ...
- UVA 572 dfs求连通块
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...
- C. Edgy Trees Codeforces Round #548 (Div. 2) 并查集求连通块
C. Edgy Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)
UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常 ...
随机推荐
- 你真的知道什么是【共享Session】,什么是【单点登录】吗?
一直有人问,为什么我实现的共享session不能单点登录,今天我也抽时间准备好好说一下. 我要喷(别喷我) 首先,网上水货文章很多,CSDN居多.CSDN转载率很高,也就是说同相同文章有很多,换汤不换 ...
- CentOS7 yum 安装 PHP 5.6.24
配置yum源 追加CentOS 6.5的epel及remi源. # rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel- ...
- 从CAP理论中分析Eureka与zookeeper的区别
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性)和P(分区容错性).由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡.在此Zookeeper保证 ...
- (最小生成树 Prim) nyoj1403-沟通无限校园网
题目描述: 校园网是为学校师生提供资源共享.信息交流和协同工作的计算机网络.校园网是一个宽带.具有交互功能和专业性很强的局域网络.如果一所学校包括多个学院及部门,也可以形成多个局域网络,并通过有线或无 ...
- 剑指Offer_编程题_1
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. class Sol ...
- 信用评分卡 (part 2of 7)
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- python 基础技巧
多个字典合并 >>> d1 = {'name' : 'revotu', 'age' : 99} >>> d2 = {'age' : 24, 'sex' : 'mal ...
- Elastic Stack之Redis集群使用
Elastic Stack之Redis集群使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客数据流走向:FileBeat ===>Redis ===>lo ...
- Linux学习笔记:【000】Linux系统入门
什么是Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX(可移植操作系统接口 Portable Operating System Interface of UN ...
- 2018牛客网暑期ACM多校训练营(第一场)J Different Integers(树状数组)
题意 给出一串数字以及q次查询,每次查询l,r],要求求出[1,l]和[r,n]的所有不相同的数字个数. 分析 先对数组进行倍增,变为两倍长,然后查询就变成一个完整的区间.离线处理,按r从小到大排序, ...