白令海峡的题解

原题描述:
 

时间限制: 1000ms

空间限制: 524288kB

题目描述

很久很久以前,一座大陆桥横跨西伯利亚东端与美洲大陆西端。

处于进化早期的人类,正以部落的形式在大陆上游荡、捕猎,四海为家。在饥饿与寒冷折磨下,人们不断迁徙。在不知不觉中,也许有一支队伍、也许有许多支队伍,跨过了大陆桥,来到了美洲大陆。人类繁衍与进化的脚步自此迈上了美洲大陆。

然而,板块位移,地质变迁,陆地慢慢被大海淹没,广阔的海峡将亚欧大陆和美洲大陆的人类分隔开来。也许是万年,也许是十万年,两岸的人类才能再度相见。

大陆架可以看作一个 n \times m 的矩形区域,区域内有一些格子已经被海洋所淹没。在接下来的q年里,区域内还有一些格子会逐个沉没。那么到底是哪一年两座大陆才会分隔开来呢?

输入格式

第一行一个整数 T 代表数据组数。

每组数据第一行两个整数 n 和 m,

接下来 n 行每行 m 个整数,为 1 表示已经被淹没,为 0 表示仍为陆地。

接下来一行一个整数 q,

接下来 q 行每行两个整数,表示沉没的格子坐标。

输出格式

每组数据输出一行,代表答案。如果 q 年之后还连通,输出-1

样例输入

1
4 6
011010
000010
100001
001000
7
0 3
1 5
1 3
0 0
1 2
2 4
2 1

样例输出

4

样例解释

到第 4 年,无法从上面到达下面。

第3年可以从上面走到下面,我们可以想象输入是一个连接着上方和下方的桥。

 第0年,我们可以这么走:

数据规模

1 \le T \le 10,1\le n,m \le 500,1\le q \le n\times m,0\le x\le n,0\le y\le m

主要思路:

这题你第一眼的感觉是否是对于每一年写个bfs判断能不能走到底,那我很荣幸的告诉你,恭喜你:TLE 0分。

有眼睛的人会先看一下数据范围(q<=n*m),接着看一下文章标签(二分),最后顺手来个三连

回归正题。

我们想,如果第mid年,不能从第一行走到第n行,那么mid+1~q年岂不是都不能从第一行到第n行(因为海水只会淹没更多的地方)

发现了啥???

没错单调性!!!

有单调性,你脑海里第一个会想到啥???

二分答案。

所以这题一切都简单了

但还有一个问题,二分找到的是可以从1走到n的情况(我是这样写的),所以ans不能直接=mid(因为mid不是答案)ans要=mid+1

小细节:

注意q的大小(n*m)所以数组要开500*500=250000

然后每次判断bfs的时候要vis清空,a数组的变化。

代码code:

#include<bits/stdc++.h>
using namespace std;
int t;
char a[1010][1010];
int vis[1010][1010];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int asd[1000010],fgh[1000010];
int n,m;
struct node
{int x,y;
};
int q;
bool bfs(int mid)
{memset(vis,0,sizeof(vis));queue<node> q1;for(int i=1;i<=min(mid,q);i++)//哪里被淹没了{vis[asd[i]][fgh[i]] = 1;}for(int i=0;i<m;i++)//哪里可以当起点{if(a[0][i] == '0'&&vis[0][i]!=1){q1.push({0,i});vis[0][i] = 1;}}while(!q1.empty())//bfs{auto tmp = q1.front();q1.pop();if(tmp.x == n-1){return 1;}for(int i=0;i<4;i++){int tx=tmp.x+dx[i],ty=tmp.y+dy[i];if(tx<0||tx>=n||ty<0||ty>=m||vis[tx][ty]||a[tx][ty] == '1'){continue;}vis[tx][ty] = 1;q1.push({tx,ty});}}return 0;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cin>>t;while(t--){cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>a[i][j];}}cin>>q;int flag=1;for(int i=1;i<=q;i++){cin>>asd[i]>>fgh[i];}int l=0,r=q+1;int ans=INT_MAX;//二分while(l<=r){int mid=(l+r)/2;if(bfs(mid)){l = mid+1;ans = mid+1;}else{r = mid-1;}}
//		cout<<bfs(4);if(ans == INT_MAX){cout<<-1<<'\n';}else{cout<<ans<<'\n';}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2803415.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

开源软件:塑造软件行业未来的协作与创新之力

随着信息技术的迅猛发展&#xff0c;开源软件已经逐渐成为软件开发的潮流&#xff0c;以其独特的低成本、可协作性和透明度等特性&#xff0c;在全球范围内引起了广泛的关注和应用。越来越多的企业和个人选择使用开源软件&#xff0c;这不仅推动了软件行业的繁荣&#xff0c;还…

电路设计(27)——交通信号灯的multisim仿真

1.功能要求 使用数字芯片设计一款交通信号灯&#xff0c;使得&#xff1a; 主干道的绿灯时间为60S&#xff0c;红灯时间为45S 次干道的红灯时间为60S&#xff0c;绿灯时间为45S 主、次干道&#xff0c;绿灯的最后5S内&#xff0c;黄灯闪烁 使用数码管显示各自的倒计时时间。 按…

: ) 万字项目实践指南——贪吃蛇 手把手教你写出自己的小游戏!

目录 前言 1. 游戏背景 2. 游戏效果演示 3. 目标 4. 项目定位 5. 技术要点 6. Win 32 API 介绍 6.1 Win32 API 6.2 控制台程序&#xff08;Console) 6.3 控制台屏幕上的坐标COORD​ 6.4 GetStdHandle 6.5 GetConsoleCursorInfo 6.5.1 CONSOLE_CURSOR_INFO ​ 6.6 SetConsoleCur…

Yooasset、UniTask 使用遇到的一个奇怪的问题

先上截图 从截图可以看出 释放资源的方法是一个同步方法&#xff0c;但是执行释放资源的时候&#xff0c;竟然触发了我另一个地方的代码。 经检查&#xff0c;这个地方之所以会被执行&#xff0c;是因为Yooasset在释放资源的时候&#xff0c;激活了加载资源的等待。

迅为RK3568开发板驱动开发指南-输入子系统

《iTOP-RK3568开发板驱动开发指南》更新&#xff0c;本次更新内容对应的是驱动&#xff08;第十三篇 输入子系统&#xff09;视频&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 第13篇-输入子系统目录 第1篇 驱动基础篇 第2篇 字符设备基础 第3篇 并发与竞争 …

如何用jmeter请求application/octet-stream,image/jpeg

用postman调用时&#xff1a; 用jmeter&#xff1a; 注意上图不要勾选&#xff0c;不然会把所有的内容都以二进制传进去&#xff0c;我们不勾选只传二进制的图片内容&#xff0c;勾选了会把MIME类型、参数名称都转为二进制传进去。会报错。

网络知识

目录 IP地址(Internet protocol address) —— 互联网协议地址 子网掩码 网关 路由 DNS&#xff08;Domain Name Server&#xff09; —— 域名服务器 IP地址(Internet protocol address) —— 互联网协议地址 子网掩码 作用&#xff1a;划分网段 网络部分相同的IP地址&a…

【数据结构】排序(2)

目录 一、快速排序&#xff1a; 1、hoare(霍尔)版本&#xff1a; 2、挖坑法&#xff1a; 3、前后指针法&#xff1a; 4、非递归实现快速排序&#xff1a; 二、归并排序&#xff1a; 1、递归实现归并排序&#xff1a; 2、非递归实现归并排序&#xff1a; 三、排序算法…

实在智能签约国内头部燃气集团:用Agent加速数智化深入,量利双升建设智慧燃气

燃气是我国四大能源产业之一&#xff0c;是推进国民经济建设与生态保护协同发展的主战场&#xff0c;高速的发展机遇下伴随着诸多挑战&#xff1a;随着业务规模扩大&#xff0c;运营工作量和复杂度不断上升&#xff0c;考验企业的业态模式能力&#xff1b;运营各环节需投入大量…

基于springboot+vue的智能推荐的卫生健康系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

你还不会大厂必考的10个经典排序算法吗?

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 前言 众所周知&#xff0c;10个经典排序算法在大厂的校招、社招面试中频繁出现&#xff0c;那么今天我们就来用JS语言实现一下这10个经典排序算法吧。 概念 排序算法&#xff1a; 排序算法是《数据结构与算法》中…

vscode远程调试服务器的Python代码

目录 1 配置vscode远程阅读代码 2 打开conda环境 3 配置相应的调试环境 4 开始调试 这篇博客首先参考了我自己之前的两篇博客 vscode怎么查看python库的源代码/vscode打开conda环境 ubuntu上安装vscode&#xff0c;并远程开发与远程调试服务器代码 1 配置vscode远程阅读…

Intel PT简介以及perf 使用 Intel pt

文章目录 前言一、工作原理二、追踪执行流程三、追踪定时信息四、perf使用 intel pt4.1 perf record4.2 perf report4.3 perf script 五、与 Intel LBR 比较六、perf 对 Intel pt 的支持参考资料 前言 代码插装是最古老的性能分析方法之一。我们经常使用它。在函数开头插入pri…

Oerlikon欧瑞康LPCVD system操作使用说明

Oerlikon欧瑞康LPCVD system操作使用说明

C++从入门到精通 第五章(指针与引用)

写在前面&#xff1a; 本系列专栏主要介绍C的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程&#xff0c;笔者的原创部分主要在示例代码的注释部分。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C教材&#xff08;比…

怎么把ppt压缩到10m以内?立刻学会~

在分享PPT文件时&#xff0c;文件大小通常会成为一个重要考虑因素。过大的文件不仅会增加传输和下载时间&#xff0c;还可能遇到一些网络限制。本文将介绍如何将PPT文件压缩到10M以内的方法&#xff0c;并详细介绍使用压缩工具的解决方案。 使用压缩工具的解决方法 工具一&…

http协议基础与Apache的简单介绍

一、相关介绍&#xff1a; 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上&#xff0c;大家把连接在因特网上的计算机都成为主机。万维网&#xff1a;WWW&#xff08;world…

Excel面试题及答案(1)

1.辅助列添加,快速填充方式填充隔行的编号;定位条件定位到空值后,右击---插入整行 2.利用通配符计算A3:A9含有车间的单元格个数(保留计算公式)。 3.利用身份证号提取 “性别”、“年月日”、“年龄” 性别:利用mid()方法,添加了一列辅助列,根据提取身份证后面第2位…

【Python笔记-设计模式】工厂模式

一、说明 (一) 解决问题 提供了一种方式&#xff0c;在不指定具体类将要创建的情况下&#xff0c;将类的实例化操作延迟到子类中完成。可以实现客户端代码与具体类实现之间的解耦&#xff0c;使得系统更加灵活、可扩展和可维护。 (二) 使用场景 希望复用现有对象来节省系统…

Leetcoder Day17| 二叉树 part06

语言&#xff1a;Java/C 654.最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 …