hdu5652 India and China Origins(并查集)
India and China Origins
很久以前,中国和印度之间并没有喜马拉雅山相隔,两国的文化交流很频繁。随着喜马拉雅山海拔逐渐增加,两个地区的交流也越来越少,最终没有了来往。

假设当时的地形和我画的一样,蓝色部分代表海洋,而且当时人们还没有发明轮船。黄色部分代表沙漠,而且沙漠上经常有野鬼散步,所以人们不敢到沙漠中行走。黑色的格子表示山峰,这些山峰都无比高大,所以人无法穿过。白色格子代表平原,人可以在平原上自由行走。人每次可以向相邻的四个格子走动。 此外,我们的考古学家发现还有一些山峰会逐渐形成,通过研究发现,位置在 (x, y)(x,y) (保证该位置之前没有山峰)的地方在 ii 年后出现了山峰。现在给你若干个位置出现山峰的时间,你可以计算出中国和印度之间的联系最早被彻底切断的时间吗?
多组测试数据, 第一行为组数T(T\leq 10)T(T≤10)。每组测试数据第一行包含两个数 N, M (1 \leq N, M \leq 500)N,M(1≤N,M≤500), 表示地图的大小。接下来 NN 行长度为 MM 的 0101 字符串。00代表白色格子,11 代表山峰。接下来有 Q(1\leq Q \leq N\times M)Q(1≤Q≤N×M) 行,第 i(1\leq i \leq Q)i(1≤i≤Q) 两个整数 (x,y),0 \leq x < N, 0 \leq y < M(x,y),0≤x<N,0≤y<M 表示在第 ii 年 (x,y)(x,y) 出现了一座山峰。
对于每组测试数据,输出一个数, 表示两国最早失联的时间。如果最终两国之间还有联系则输出 -1。
1
4 6
011010
000010
100001
001000
7
0 3
1 5
1 3
0 0
1 2
2 4
2 1
4

从上图可以看到,两国在第四年彻底失去了联系。
/*
hdu5652 India and China Origins(并查集) 给你一个棋盘形状的东东,上面1代表无法越过的山峰,0代表可以通过的平原.
而且在接下来q次会出现一些山峰,问多少次后棋盘上下不连通
如果一直联通则输出-1 开始想到了并查集但是实现起来有点问题,每次插入后都要把最左边一列判断
一下,看他们的父亲是否是棋盘的最右端.感觉并不够简便
然后参考了下大神们的代码,发现可以在合并的时候记录下这个联通量最左边
和最右边的位置,这样每次合并时只需要判断max-min是否等于棋盘的宽度就
好了
果然自己太死板了TAT hhh-2016-03-27 12:42:45
*/ #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define lson (i<<1)
#define rson ((i<<1)|1)
typedef long long ll;
const int maxn = 505 ;
int from = 500*500;
int to = 500*500+1;
int n,m;
int dir[9][2] = {{1,1},{1,0},{0,1},{1,-1},{0,-1},{-1,1},{-1,-1},{-1,0}};
char str[maxn];
int far[maxn*maxn];
int tmap[maxn][maxn];
int l[maxn*maxn],r[maxn*maxn]; int fin(int x)
{
return x == far[x]? x : far[x] = fin(far[x]);
} bool unio(int a,int b)
{
int ta = fin(a);
int tb = fin(b);
if(ta != tb)
{
far[ta] = tb;
l[tb] = min(l[ta],l[tb]);
r[tb] = max(r[ta],r[tb]);
if(r[tb] - l[tb] == m-1)
return 1;
}
return 0;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i = 0; i < n; i++)
{
scanf("%s",str);
for(int j = 0; j < m; j++)
{
tmap[i][j] = str[j]-'0';
far[i*m+j] = i*m+j;
}
} for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
//if(tmap[i][j])
{
l[i*m+j] = j;
r[i*m+j] = j;
}
}
int flag =0;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(tmap[i][j])
{
for(int k = 0; k < 8; k++)
{
int tx = i + dir[k][0];
int ty = j + dir[k][1];
if(tx < 0 || tx >= n || ty < 0 || ty >= m || !tmap[tx][ty])
continue;
if(unio(i*m+j,tx*m+ty))
flag = 1;
} }
}
}
if(flag)
printf("0\n");
int q;
scanf("%d",&q);
for(int i = 0; i < q; i++)
{
int x,y;
scanf("%d%d",&x,&y);
tmap[x][y] = 1;
if(flag)
continue;
for(int k = 0; k < 8; k++)
{
int tx = x + dir[k][0];
int ty = y + dir[k][1];
if(tx < 0 || tx >= n || ty < 0 || ty >= m || !tmap[tx][ty])
continue;
if(unio(x*m+y,tx*m+ty))
{
flag = 1;
printf("%d\n",i+1);
}
}
}
if(!flag)
printf("-1\n");
}
return 0 ;
}
hdu5652 India and China Origins(并查集)的更多相关文章
- hdu 5652 India and China Origins 并查集+二分
India and China Origins Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- hdu 5652 India and China Origins 并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题目大意:n*m的矩阵上,0为平原,1为山.q个询问,第i个询问给定坐标xi,yi,表示i年后这 ...
- hdu 5652 India and China Origins 并查集+逆序
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意:一张n*m个格子的点,0表示可走,1表示堵塞.每个节点都是四方向走.开始输入初始状态方格, ...
- hdu-5652 India and China Origins(二分+bfs判断连通)
题目链接: India and China Origins Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- hdu5652:India and China Origins(并查集)
倒序操作用并查集判断是否连通,新技能get√(其实以前就会了 这题细节很多...搞得整个程序都是调试输出,几度看不下去想要重写 并查集到现在大概掌握了两个基本用途:判断是否连通 / 路径压缩(上一篇b ...
- 并查集(逆序处理):HDU 5652 India and China Origins
India and China Origins Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- HDU 5652 India and China Origins(并查集)
India and China Origins Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- HDU 5652 India and China Origins 二分+并查集
India and China Origins 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5652 Description A long time ...
- HDU 5652 India and China Origins(经典并查集)
特别经典的一个题,还有一种方法就是二分+bfs 题意:空间内n*m个点,每个点是0或者1,0代表此点可以走,1代表不能走.接着经过q年,每年一个坐标表示此点不能走.问哪年开始图上不能出现最上边不能到达 ...
随机推荐
- bzoj千题计划113:bzoj1023: [SHOI2008]cactus仙人掌图
http://www.lydsy.com/JudgeOnline/problem.php?id=1023 dp[x] 表示以x为端点的最长链 子节点与x不在同一个环上,那就是两条最长半链长度 子节点与 ...
- 山西某公司NetApp存储不小心删除文件数据恢复成功案例
故障情况简介: 需要进行数据恢复的设备是一台NetApp存储,共有24块磁盘组成.由于管理员删除文件夹,且时间比较久,删除有几个月时间. 可恢复性判断:由于NetApp中的文件系统的特性,WAFL是& ...
- Python内置函数(62)——exec
英文文档: exec(object[, globals[, locals]]) This function supports dynamic execution of Python code. obj ...
- 获取apk项目的MD5值和SHA1值
一些可说可不说的话: * 以前有一个更简单的方法,在as的右边工具栏的 gradle 面板中可以很方便的获取到: * 上次用也是在2年前,时间长了给忘记了,不过我记得我当时写了笔记,这会笔记不在身边, ...
- 新概念英语(1-127)A famous actoress(女演员)
A:Can you recognize that woman, Liz ?B:I think I can, Kate. It must be Karen Marsh, the actoress.A:I ...
- android webview重定向 返回按钮死循环问题修改
当HTML有重定向的时候,回退时会不断往跳转进入死循环.尝试修改webview缓存加载策略以后,不起作用.在网上查阅资料以后,跟 shouldOverrideUrlLoading的返回值为true还是 ...
- IT技术有感
今天看技术文章,spring相关的,某一个点以前每次看一直不理解, 可是不知道为什么隔了1年左右,中间什么都没做,现在却都懂了. 在看懂的那一刻,笼罩在我心上的躁动突然平静了许多,我的心这一年来前所未 ...
- SQLContext、HiveContext自定义函数注册
本文简单介绍两种往SQLContext.HiveContext中注册自定义函数方法. 下边以sqlContext为例,在spark-shell下操作示例: scala> sc res5: org ...
- Struts(二十八):自定义拦截器
Struts2拦截器 拦截器(Interceptor)是Struts2的核心部分. Struts2很多功能都是构建在拦截器基础之上,比如:文件上传.国际化.数据类型转化.数据校验等. Struts2拦 ...
- mysql中出现Unknown column 'qwe' in 'field list'的错误
下面是我建表的代码 输入数据的代码 可以看到出现了类似Unknown column 'qwe' in 'field list'的错误 当时看了好久改了又改都没有找到错误,直道我在一次打C语言代码的过程 ...