hdu5652 India and China Origins(并查集)

从零构建C++ Gerber解析器:以PCB缺陷检测为目标的实战指南 本文是一份面向PCB缺陷检测项目的实战指南,详细介绍了如何从零开始使用C++构建高性能的Gerber文件解析器。文章深入剖析了Gerber RS-274X格式,并提供了完整的开发环境搭建、核心数据结构设计、解析步骤实现以及为缺陷检测优化的具体方案,旨在帮助开发者获得对PCB制造数据的深度控制与极致性能。 阅读详情

India and China Origins

 
 Accepts: 49
 
 Submissions: 426
 Time Limit: 2000/2000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
很久以前,中国和印度之间并没有喜马拉雅山相隔,两国的文化交流很频繁。随着喜马拉雅山海拔逐渐增加,两个地区的交流也越来越少,最终没有了来往。




假设当时的地形和我画的一样,蓝色部分代表海洋,而且当时人们还没有发明轮船。黄色部分代表沙漠,而且沙漠上经常有野鬼散步,所以人们不敢到沙漠中行走。黑色的格子表示山峰,这些山峰都无比高大,所以人无法穿过。白色格子代表平原,人可以在平原上自由行走。人每次可以向相邻的四个格子走动。

此外,我们的考古学家发现还有一些山峰会逐渐形成,通过研究发现,位置在 (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
Hint

从上图可以看到,两国在第四年彻底失去了联系。



/*
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 ;
}


C++ PCL点云处理实战专栏 工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。 阅读详情

相关推荐

Rsoft仿真实战:长周期光纤光栅参数优化与模式耦合分析

本文详细介绍了使用Rsoft软件进行长周期光纤光栅(LPFG)参数优化与模式耦合分析的实战方法。通过Rsoft仿真,可以高效优化光栅周期、包层厚度等关键参数,深入分析纤芯模与包层模的耦合特性,为光纤通信和传感应用提供可靠的设计依据。

h0i1j2k3l的博客 1115

算法分析与设计之并查集详解

本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find。更多的信息可以参考Algorithms一书的Section 1.5,实际上本文也就是基于它的一篇读后感吧。原文中更多的是给出一些结论,我尝试给出一些思路上的过程,即为什么要使用这个方法,而不是别的什么方法。我觉得这个可能更加有意义一些,相比于记下一些结论。

weixin_52448922的博客 1073

高频功率放大器的设计实现

摘 要 随着无线通信技术的高速发展,市场对射频电路的需求越来越大,同时对射频电路的性能要求也越来越高。高频功率放大器是位于无线发射级末端的重要部件,为了弥补信号在无线传输过程中的衰耗,要求发射机具有较大功率的输出,通信距离越远,要求的输出功率越大。在高频范围内,为了获得足够大的高频输出功率,就要采用高频功率放大器。 本次课程设计的高频功率放大器的技术指标包括输出功率、效率、功率增益、由于高频频功率放大器的输出功率比较大,耗能比较多,所以工作效率就显得比较重要。本课程设计的高频功率放大器电路由两极功率放大器

qq_43543515的博客 3万+

hdu 5652(并查集)

题意:很久之前,在中国和印度之间有通路,通路可以简化为一个n*m的字符串,0表示能通过,1表示障碍,每过一年就有一个坐标变成1,问你什么时候,通路彻底无法通过; 解题思路:无向图的连通性,一般直接搜索或者并查集判定,这里用的是并查集,我们把相连的障碍放到一个集合内,然后如果第一列的某点和最后一列的某点也在这个集合内,那么说明,这个通路被障碍堵死了; 这里要处理下第一列和最后一列的问题,可以选择...

weixin_30610755的博客 134

支付漏洞防护绕过的一种方式

放完包后就到了提交订单的地方,可以发现,金额确实小了很多,合理的搭配的话还可以更低,再次前进可以发现,金额确实是这么多,后面就不支付了,到此就结束了。也就是说数量可以为负数,但是金额不能为0或者0以下,有什么方法可以绕过这个限制吗,其实并不难,既然可以为负数,只是对金额不能为0或者负数做了限制。我们可以尝试拼接法,利用负数加上正数让他的值变得很低,但是又大于0就可以了,这里利用购物车的结算方法,随机加一些在购物车里。这里为了方便查看数据包,我这边商品的数量选择3,点击立即购买并抓包。

2301_80115097的博客 1528

ERA5 数据集下载(2025最新 可运行)

众所周知,ERA5数据集经过了更新,尤其是在API访问和下载方式上发生了变化。2025年版的ERA5数据集为气象研究人员提供了更高质量的历史气象数据。本文将介绍如何通过新的API接口下载最新的ERA5数据集。

m0_72141699的博客 3589

数据结构之并查集(hdu1988 hdu2492)

(抄知识点方便自己复习)//摘自俞勇的acm国际大学生程序设计竞赛,知识与入门 基本概念 不相交集为一组彼此不相交(没有公共元素)的集合。并查集算法作用于一个不相交集,实际应用中可以在近乎常数的时间内完成下列两种操作。 1:查找(find):确定元素所在的集合。一般用来判断两个元素是否在同一个集合。 2:合并(Union):将两个集合合并成一个集合。 对于查找操作,假设需要确定x所在

m_Cryophoenix的博客 382

【微知】关于GB200 NVL72服务器的一些信息?(36CPU72GPU;LPDDR5X 17T;HBM3e 13.5T;5代NVlink 1.8TB; 720P算力FP8;120Kw)

本文仅根据官网介绍分析,存在纰漏仅供参考。

技术札记 5382

HDU 6109(并查集)

HDU 6109(并查集)

ME495的博客 505

【SpringBoot 3.x 第92节】Spring Modulith:构建模块化单体架构(基于 Spring Boot 3),一文带你搞透(超详细)!

🏆本文收录于《滚雪球学SpringBoot 3.x》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    该专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。

**My Coding Family** 998

PCL 使用点云创建数字高程模型DEM【2025最新版】

使用点云创建数字高程模型DEM,并将结果保存为高程图像。博客长期更新,本文最近更新时间为:2025年9月15日。

点云侠的博客 2294

并查集

[简介]在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。在数据量过大时,只能用并查集来描述。并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。并查集的相关介绍参见并查集详解。 其核心函数如下:#define

legend4917的专栏 413

[HBM] RAM Cell Self Repair | 内存单元自我修复

对抗错误的大都是冗余,内存颗粒在设计的时候也考虑增加冗余。具体的说:添加冗余或备用的存储单元行和列,及时将测试中的故障进行修复和替换,存储器修复包括行修复,列修复或两者的组合。

串起点滴 783

hdu 5652 India and China Origins 并查集+BFS

hdu 5652 India and China Origins 并查集+BFS 题目链接: India and China Origins 题意:给定N*M的一个地图,1代表障碍物,0代表路,然后在Q个单位时间中,每过一个单位时间,向地图中某点添加一个障碍物,问到哪个时刻,人不能从第一行访问到最后一行。人只可以上下左右移动。如果到了Q时刻还从第一行能访问到最后一行,输出-1。 思路1:首先

Fighting! 1419

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

HDU5652India and China Origins 并查集

India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 118    Accepted Submission(s): 34 Problem Description A long ti

Jonariguez 吾本优秀 950

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

并查集 hdu5652 India and China Origins

传送门:点击打开链接 题意:告诉你地图的大小,每年有的地方会长出山峰,问什么时候两端开始不连通的。 思路:先到最后一年,就是长出很多山峰时开始。 之后相当于把山峰拆掉,所以就是把4个方向的空地用并查集合并,然后判断两端是否已经连通。 就这样倒着xjb搞,就能出答案了,注意点细节和输出答案的时间就行了 #include #include #include #include #inc

qwb的博客 696

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

HDU 5652 India and China Origins(并查集)

India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 441    Accepted Submission(s): 133 Problem Description A lo

Dacc123的博客 929

HDU 5652 India and China Origins(并查集)

题意: 中国和印度之间有一片地方,把这片地方抽象化,于是就可以看成一个N * M矩阵,其中黑色的代表高山不能走过 去,白色的代表平原,可以通行,人每次可以选择往上下左右四个方向移动,但是随着时间的变化某些白色的平原会变 成黑色的高山,从而变为不可通行,题目中给出一个代表地势的图,然后有 Q 次操作,第 i 次操作 代表在第 i 年 (x, y) 处的平原变成了高山,即白色变为了黑色。问中国

Ash.的博客 640

hdu5652 India and China Origins(并查集)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5652 题目大意: 在n*m的矩阵里面,放值为1的山峰。当山峰连起来能够封锁整个m列的时候,问最早是什么时候。 范围: n,m 思路: 可以用并查集存下每个点能向左延伸的距离和向右延伸的距离。当有一个点为1的时候,看他8个方向是否有为1的山峰,如果有就将他们并入同一个集合,然后更新他

hahahaha 692

hdu 5652 India and China Origins (并查集)

India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 920    Accepted Submission(s): 313 Problem Description A long t

哇咔咔 501

HDU-5652 India and China Origins(并查集)

借鉴自:http://www.cnblogs.com/shuguangzw/p/5324207.html India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1128    Acc

lljjccsskk的专栏 337

HDU 5652 India and China Origins (并查集判断联通)

题意:      给出一个n*m的图,1是山峰,0是平原,还有q个操作,可以把0变成1,问最少前几次操作可以使得图的上端和下端完全阻隔,就是被1隔开。   上下左右四个方向走。没有断绝就输出 -1 分析:      并查集判断联通,一开始只想到用dfs判断联通,然后GG了。       这题可以正着搞。判断山是否左右联通就行了(注意山是8联通的,不是平原,倒着搞就是4联通

Follow My Heart 559

hdu 5652 India and China Origins 并查集

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题目大意:n*m的矩阵上,0为平原,1为山。q个询问,第i个询问给定坐标xi,yi,表示i年后这里的平原上会长出山。问第几年以后印度和中国交流会被阻碍 思路:(官方题解)这是一个连通性的问题。你会发现如果将所有操作逆序来看的话就很容易用并查集来处理了。 首先把所有的山峰都加到图中,然后逆序处...

weixin_30414155的博客 96

hdu5652 India and China Origins BFS+二分 或 二维的并查集

India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1165    Accepted Submission(s): 382 Problem Description A l

EventQueue的博客 600

HDU-5652 India and China Origins(并查集)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意: 两国之间有一个n*m的棋盘,中间一开始有一些山脉,后来每年新增一个山脉,求两国第一次被彻底隔绝的时间。未被隔绝返回-1。 思路: 500*500的大小,可以展开成250000个节点求并查集,先把所有的山脉都放上去,然后处理一下并查集,就是每个节点和旁边的4个节点是否都是平地,是就

MyWorld 587
上一篇: 5650 so easy
下一篇: hdu 3397 线段树双标记
Tyuio28
博客等级 码龄11年 12粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值