思维+并查集 hdu5652
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652
题意:
输入T,接下来T个样例,每个样例输入n,m代表图的大小,接下来n行,每行m个数,代表图,0表示这个位置可以走,1表示走不了,接下来q个点的位置,表示第q个时间这个点的值变成1,就不能走了,问在什么时间开始从最上面无法走到最下面。
最后还是看了别人博客(不争气啊),用并查集的思路就是先给每个点编号,然后用两个数组pre1,pre2数组方便存储编号为i的点所在的点集(并查集)里面最左和最右的值,当最左的值为0,最右的值为m-1是说明这个连续的点集已经把上下隔断了。只是大致说了下,看代码,有人也用了二分+BFS,对q个时间段进行二分,用BFS判断上下是否被隔断,应该是这样,没用这种方法写。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 505
int n,m,k,t,ans,id;
char str[maxn][maxn];
int num[maxn][maxn];//记录点str[i][j]对应的编号
int pre1[maxn*maxn],pre2[maxn*maxn];//两个数组记录祖先,祖先编号对m取模得出的值就是左右两边最值
int dir[][]={,,,-,,,-,,,,,-,-,,-,-};//八个方向
int find1(int a)
{
if(a==pre1[a])
return a;
return pre1[a]=find1(pre1[a]);
}
void combine1(int x,int y)
{
int a=find1(x);
int b=find1(y);
if(a%m<b%m)//祖先编号对m取模值较小的为合并之后的祖先
pre1[b]=a;
else
pre1[a]=b;
}
int find2(int a)
{
if(a==pre2[a])
return a;
return pre2[a]=find2(pre2[a]);
}
void combine2(int x,int y)
{
int a=find2(x);
int b=find2(y);
if(a%m>b%m)//祖先编号对m取模值较大的为合并之后的祖先
pre2[b]=a;
else
pre2[a]=b;
}
void bianhao()
{
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
num[i][j]=++id;//给每个点编号
pre1[id]=id;
pre2[id]=id;
}
}
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
if(str[i][j]=='')
{
for(int k=;k<;k++)//搜索每个黑块周围
{
int a=i+dir[k][];
int b=j+dir[k][];
if(a>=&&a<n&&b>=&&b<m&&str[a][b]=='')
{
combine1(num[i][j],num[a][b]);
combine2(num[i][j],num[a][b]);
}
}
}
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
ans=-;
id=-;
for(int i=;i<n;i++)
scanf("%s",str[i]);
bianhao();
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
int a=find1(num[i][j]);
int b=find2(num[i][j]);
if(a%m==&&b%m==m-)//在山峰升起前可能两国可能已经隔断
{
ans=;
break;
}
}
if(ans!=-)
break;
}
int q;
scanf("%d",&q);
for(int s=;s<=q;s++)
{
int x,y;
scanf("%d%d",&x,&y);
str[x][y]='';//山峰升起
if(ans!=-)
continue;
for(int i=;i<;i++)
{
int a=x+dir[i][];
int b=y+dir[i][];
if(a>=&&a<n&&b>=&&b<m&&str[a][b]=='')
{
combine1(num[x][y],num[a][b]);
combine2(num[x][y],num[a][b]);
int l=find1(num[x][y]);
int r=find2(num[x][y]);
if(l%m==&&r%m==m-)//黑色块所在点集的左右两最值达到左右边界
{
ans=s;
break;
}
}
}
}
printf("%d\n",ans);
}
return ;
}
思维+并查集 hdu5652的更多相关文章
- Gym - 101243F Vitamins(思维+并查集)
题意 有三种药丸,白色W>红色R>蓝色B,给你m个约束条件,问你n个药丸的颜色,不能确定颜色输出‘?’ 题解 如果1<2<3,只要找到2就能确定1和3的颜色 如果2=4,只要确 ...
- cf 之lis+贪心+思维+并查集
https://codeforces.com/contest/1257/problem/E 题意:有三个集合集合里面的数字可以随意变换位置,不同集合的数字,如从第一个A集合取一个数字到B集合那操作数+ ...
- 牛客网多校第4场 J Hash Function 【思维+并查集建边】
题目链接:戳这里 学习博客:戳这里 题意: 有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的. 现在给一个已经放过数的状态,求放数字的顺序.(要求字 ...
- codeforces 1013B 【思维+并查集建边】
题目链接:戳这里 转自:参考博客 题意:给一个n*m的矩阵,放入q个点,这q个点之间的关系是,若已知这样三个点(x1,y1),(x2,y1),(x1,y2),可以在(x2,y2)处生成一个新的点,对于 ...
- CodeForces - 1243D (思维+并查集)
题意 https://vjudge.net/problem/CodeForces-1243D 有一张完全图,n个节点 有m条边的边权为1,其余的都为0 这m条边会给你 问你这张图的最小生成树的权值 思 ...
- hdu5652 India and China Origins(并查集)
India and China Origins Accepts: 49 Submissions: 426 Time Limit: 2000/2000 MS (Java/Others) Memo ...
- hdu6074[并查集+LCA+思维] 2017多校4
看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...
- 【春训团队赛第四场】补题 | MST上倍增 | LCA | DAG上最长路 | 思维 | 素数筛 | 找规律 | 计几 | 背包 | 并查集
春训团队赛第四场 ID A B C D E F G H I J K L M AC O O O O O O O O O 补题 ? ? O O 传送门 题目链接(CF Gym102021) 题解链接(pd ...
- CF思维联系--CodeForces - 218C E - Ice Skating (并查集)
题目地址:24道CF的DIv2 CD题有兴趣可以做一下. ACM思维题训练集合 Bajtek is learning to skate on ice. He's a beginner, so his ...
随机推荐
- python的type class
在python中,用户定义的class是一个PyTypeObject ( XXX_Type)对象. #PyType_Type是一切类的基类,这是一个全局数据PyTypeObject PyType_Ty ...
- ECharts 的用法
1. ECharts的获得 官网: https://echarts.baidu.com/ 你可以通过以下几种方式获取 ECharts. 从官网下载界面选择你需要的版本下载,根据开发者功能和体积上的需求 ...
- Redis 密码
- 排查bug的步骤
原创文章,欢迎阅读,禁止转载. bug预防C/C++代码发布前的检查:检查有没有低级错误,可用cppcheck (bug预防是指在写程序的时候,bug没出现,积极的进行预防,减少.包括良好的编码风格. ...
- jsfl 将库中声音放置到时间轴上
setBrokenFrames("cz1.mp3",2); /**/ /*<--------------将库中声音放置到时间轴上------------->*/ /** ...
- list<T>中的按特定顺序排序
前段时间有个任务,就是把参数要按特定顺序排序,就是要是在一张大的参数表中,只选取,2,5,12,9,13,10 这几个参数,并按上述顺序进行排序. 假设这个参数在一个类中.例如: 上述参数序列就存在P ...
- 【转】解决Eclipse中SVN版本信息不显示的问题
eclipse 中使用 svn 插件,原本正常,未作任何更改,最近几天突然eclipse 中查看文件时,文件后面的 版本号 . 文件的状态图标 等等都不见了.以为有插件冲突,卸载了好多其他的相关的插件 ...
- mycat 多个逻辑库加读写分离
上3篇笔记主要记录了,读写分离,单库分表,分库分表 这次改动了下,实现了分库分表以及读写分离,基于多个逻辑库,先看配置文件 server.xml <user name="root&qu ...
- docker仓库harbor搭建随笔
docker除了自己的registry仓库工具外,还有vmware出品的harbor,harbor集成了ui界面,用户级别认证,重要的是对镜像管理比较全面,可以删除镜像,下面是 简单的部署指南 首先: ...
- Android EditText 操作。。。
EditText请求焦点三连击... editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.req ...