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个格子,也可用常 ...
随机推荐
- linux系统调用之网络管理1
getdomainname 取域名 setdomainname 设置域名 gethostid 获取主机标识号 sethostid 设置主机标识号 gethostname 获取本主机名称 sethost ...
- 计算机基础:计算机网络-chapter6应用层
应用层为协议最顶部,为用户服务. 常见的服务:邮件,万维网,DNS等 DNS:使用UDP承载,部分使用TCP协议 作用 将域名映射为IP 域名格式:自己到上级域名的访问 DNS服务器提供域名的资源记录 ...
- java 学习:在java中启动其他应用,由jenkins想到的
在jenkins的实践中遇到了一个问题: 我的项目依赖其他第三方应用的地方比较多,而且会占用多个端口,如何处理端口和启动/关闭第三方应用成了难题. 初级解决方案:在服务端上面写一堆bat文件,,,,_ ...
- 使用docker-compose部署nginx
1.新建docker-compose.yml文件,文件的基本模板如下:(由于yml格式比较严格,注意空格缩进) version: '2.0' services: nginx: restart: a ...
- Tensorflow object detection API 搭建物体识别模型(一)
一.开发环境 1)python3.5 2)tensorflow1.12.0 3)Tensorflow object detection API :https://github.com/tensorfl ...
- JAVA核心技术I---JAVA回顾
一:基础类型运算 大部分的指令都没有支持byte.char.short,没有任何指令支持boolean类型.编译器在编译期或者运行期将byte和short类型的数据带符号扩展为相应的int类型数据,将 ...
- python 线程(创建2种方式,锁,死锁,递归锁,GIL锁,守护进程)
###############总结############ 线程创建的2种方式(重点) 进程:资源分配单位 线程:cpu执行单位(实体) 线程的创建和销毁的开销特别小 线程之间资源共享,是同一个 ...
- wxpython绘制音频
#-*- coding: utf-8 -*- ############################################################################# ...
- redis集群之主从架构
https://redis.io/topics/replication1. redis主从架构概述(1)一个master可以配置多个slave(2)slave与master之间使用异步复制进行数据同步 ...
- 启动aspx文件错误
有一次,为了模仿翻页效果,设置的启动也是aspx文件.当时因为重装系统的原因,我的系统暂时不支持aspx文件的发布访问.所以,我就在MIME Type里面添加了对aspx文件的访问,如下图: 这样就可 ...