CF1920F1 Smooth Sailing (Easy Version) 题解

魔幻暴力题。

题意简述

给你一张 n × m n\times m n×m 的地图,每个点是海 .,岛屿 # 或者火山 v。保证岛屿和非岛屿均可以形成恰好一个四连通块且岛屿不与地图边界接壤,至少有一个岛屿点与一个火山点。

定义一条合法的路径为,从一个非岛屿的点
s s s 出发,每次向四联通的非岛屿点走一格,用航线包围岛屿一整圈后回到点
s s s。一条路径包围岛屿定义为,不存在一条从岛屿出发的八连通路径可以在不触及路径的前提下到达边界。一条路径的权值为途中经过的所有点到离其最近的火山的曼哈顿距离的最小值。

现有 q q q 次询问,每次给定一个点
( x , y ) (x,y) (x,y),你需要求出从 ( x , y ) (x,y) (x,y) 出发的合法路径的最大权值。

3 ≤ n , m ≤ 1 0 5 , 9 ≤ n m ≤ 3 × 1 0 5 , q ≤ 5 3\leq n,m\leq 10^5,9\leq nm\leq 3\times 10^5,q\leq 5 3n,m105,9nm3×105,q5

解题思路

求最小值的最大值,具有单调性,可以二分。难点在于如何 check。

先跑一遍多源最短路把每个点离其最近的火山的曼哈顿距离算出来,记为 d i s i , j dis_{i,j} disi,j。若当前二分出来的答案为 k k k,则我们从询问的点 ( x , y ) (x,y) (x,y) 出发,向四个方向走,只能走 d i s dis dis 值大于等于 k k k 的点,将它们打上标记。

如何判断是否将岛屿围起来?考虑从岛屿点出发,向周围八个方向走,如果能够走到边界且路径上不经过被标记的点,则岛屿没有被完全包围。这个套路在ABC219 E中也用到了。那题也是个暴力题

于是我们就做完了。注意空间的问题,我 vector 用的不太熟练,被卡了好几发。

代码示例

#include<bits/stdc++.h>
using namespace std;
int n,m,Q,stx,sty;
int dx[10]={0,0,1,-1,1,-1,-1,1},dy[10]={1,-1,0,0,1,-1,1,-1};
string s[100010];
vector<int> dis[100010];
vector<bool> Mark[100010],vis[100010];
struct node{int x,y;
};
queue<node> q;
void Debug_dis(){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) cout<<dis[i][j]<<" ";cout<<endl;}
}
void Debug_Mark_points(int k){cout<<"ans:"<<k<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) cout<<Mark[i][j]<<" ";cout<<endl;}
}
void Get_dis(){while(!q.empty()) q.pop();for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i][j]=='v') dis[i][j]=0,q.push({i,j});}}while(!q.empty()){node u=q.front();q.pop();for(int i=0;i<4;i++){int tx=u.x+dx[i],ty=u.y+dy[i];if(tx<1||tx>n||ty<1||ty>m) continue;if(dis[tx][ty]>dis[u.x][u.y]+1){dis[tx][ty]=dis[u.x][u.y]+1;q.push({tx,ty});}}}
}
void Mark_points(int k){for(int i=1;i<=n;i++) Mark[i]=vector<bool>(m+5,0);while(!q.empty()) q.pop();q.push({stx,sty});Mark[stx][sty]=1;while(!q.empty()){node u=q.front();q.pop();for(int i=0;i<4;i++){int tx=u.x+dx[i],ty=u.y+dy[i];if(s[tx][ty]=='#') continue;if(tx<1||tx>n||ty<1||ty>m||dis[tx][ty]<k||Mark[tx][ty]) continue;Mark[tx][ty]=1;q.push({tx,ty});}}
}
bool check(int k){if(dis[stx][sty]<k) return 0;Mark_points(k);//if(k<=20) Debug_Mark_points(k);for(int i=1;i<=n;i++) vis[i]=vector<bool>(m+5,0);while(!q.empty()) q.pop();int X=0,Y=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) if(s[i][j]=='#') X=i,Y=j; }vis[X][Y]=1;q.push({X,Y});while(!q.empty()){node u=q.front();q.pop();for(int i=0;i<8;i++){int tx=u.x+dx[i],ty=u.y+dy[i];if(tx<1||tx>n||ty<1||ty>m) return 0;if(Mark[tx][ty]||vis[tx][ty]) continue;vis[tx][ty]=1;q.push({tx,ty});}}return 1;
}
void C_close(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
}
int main(){C_close();cin>>n>>m>>Q;for(int i=1;i<=n;i++) cin>>s[i],s[i]=" "+s[i];for(int i=1;i<=n;i++) dis[i]=vector<int>(m+5,1e6);Get_dis();//Debug_dis();while(Q--){cin>>stx>>sty;int l=0,r=n+m+5,ans=0;while(l<=r){int mid=(l+r)>>1;if(check(mid)) l=mid+1,ans=mid;else r=mid-1;}cout<<ans<<endl;}return 0;
} 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营day15|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数 104.二叉树的最大深度 &#xff08;优先掌握递归&#xff09; 什么是深度&#xff0c;什么是高度&#xff0c;如何求深度&#xff0c;如何求高度&#xff0c;这里有关系到二叉树的遍…

MPNN、GCN、DenseNet blocks之间的关系,GNN中“层”是什么意思?

关于GCN的普及理解&#xff1a;简单粗暴带你快速理解GNN_哔哩哔哩_bilibili GNN中层是什么意思&#xff1f; GNN中的层的意思是每次消息传递一次就叫一个层&#xff0c;在图神经网络&#xff08;GNN&#xff09;中&#xff0c;每进行一次消息传递和更新操作通常被称为一个“…

数据结构—栈实现后缀表达式的计算

后缀表达式计算 过程分析 中缀表达式 &#xff08;15&#xff09;*3 > 后缀表达式 153* (可参考这篇文章&#xff1a;中缀转后缀) 第一步&#xff1a;我们从左至右扫描 后缀表达式(已经存放在一个字符数组中)&#xff0c;遇到第一个数字字符 ‘1’ 放入栈中第二步&#xf…

幻兽帕鲁服务器出租,腾讯云PK阿里云怎么收费?

幻兽帕鲁服务器价格多少钱&#xff1f;4核16G服务器Palworld官方推荐配置&#xff0c;阿里云4核16G服务器32元1个月、96元3个月&#xff0c;腾讯云换手帕服务器服务器4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64G3…

存储技术架构演进

一. 演进过程 存储技术架构的演进主要是从集中式到分布式的一种呈现&#xff0c;集中式存储模式凭借其在稳定性和可靠性方面的优势成为许多业务数据库的数据存储首选&#xff0c;顾名思义&#xff0c;集中式存储主要体现在集中性&#xff0c;一套集中式管理的存储系统&#xff…

python:socket基础操作(4)-《tcp客户端基础》

tcp就和udp不一样了&#xff0c;tcp是客户端和服务器端&#xff0c;如果想通过tcp发送数据&#xff0c;要先让tcp进行连接服务器端 tcp客户端 先让服务器端进行启动 import socketdef main():# 创建套接字tcp_client_socket socket.socket(socket.AF_INET,socket.SOCK_STREAM…

RSTP的P/A机制

如图所示根桥S1和S2之间新添加了一条链路,在当前状态下S2的另外几个端口p2是Alternate端口,p3是指定端口且处于Forwarding状态,p4是边缘端口。新链路连接成功后,P/A机制协商过程如下。 1.P0和P1两个端口马上都先成为指定端口发送RS TBPDU。 2.S2的P1口收到更优的RST BPD…

Google Chrome 中出现 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误

证书的方式发生了变化&#xff0c;出现了这个新错误&#xff0c;导致我无法浏览该网站。 可以右键属性获取位置 关闭导航器chrome并转到文件夹&#xff0c;找到Local State文件并删除 执行指令结束进程&#xff0c;重新打开浏览器即可 taskkill /im "chrome.exe"…

Qt程序设计-自动关闭对话框的实现

本文讲解如何实现Qt自动关闭对话框。 创建项目,添加按钮 添加资源文件。 添加QDialog,该名称为WaitDialog。 头文件 #ifndef WAITDIALOG_H #define WAITDIALOG_H#include <QDialog>#include <QTimer> enum WaitDialogType {Unknown =0,Err =1,//警告Ok =2//…

fastapi报错

初始化报错&#xff0c;非常低级错&#xff0c;扇自己10八张 app FastApi()

sqli.labs靶场(第18~22关)

18、第十八关 经过测试发现User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0加引号报错 这里我们闭合一下试试 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0,127.0.0.1,adm…

深度解析指针与数组:探索内存管理的艺术

目录 1.数组名的理解 sizeof(数组名)&#xff0c;sizef中单独放数组名&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小&#xff0c;单位是字节 &数组名&#xff0c;这里的数组名表示整个数组&#xff0c;取出的是整个数组的地址 (整个数组的地…

【UE】如何让组件渲染在post之后

UE组件中的构造函数中设置这个值 bUseEditorCompositingtrue; 看了BillboardComponent的实现之后 BillboardComponent::UBillboardComponent(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { //这句话非常重要 bUseEditorCompositing true;…

R语言【taxlist】——tv2taxlist():从Turboveg数据库导入物种列表

Package taxlist version 0.2.4 Description 将Turboveg 2数据库中的物种列表导入到taxlist对象中。 在内部调用函数read.dbf()和df2taxlist()。 Usage tv2taxlist(taxlist, tv_home tv.home(), ...) Arguments 参数【taxlist】&#xff1a;在Turboveg中指示物种列表名称的…

CSS之定位

定位在CSS当中是一个比较重要的点&#xff0c;接下来&#xff0c;让我为大家介绍一下定位吧&#xff01; 属性描述position-relative相对定位position-absolute绝对定位position-fixed固定定位position-sticky粘性定位position-static静态定位 一、相对定位 给元素设置 posi…

BF16与FP16的区别

参考 BF16 与 FP16 在模型上哪个精度更高呢BF16 与 FP16 在模型上哪个精度更高呢【bf16更适合深度学习计算&#xff0c;精度更高】&#xff1a; 两者差异图示如下&#xff1a; BF16 是对FP32单精度浮点数截断数据&#xff0c;即用8bit 表示指数&#xff0c;7bit 表示小数。…

使用 FHEW-like 自举 BV-like

参考文献&#xff1a; [CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion between (ring) LWE ciphertexts[C]//International Conference on Applied Cryptography and Network Security. Cham: Springer International Publishing, 2021: 460-479.[K…

Linux——磁盘和文件系统(一)

Linux——磁盘和文件系统 磁盘机械式磁盘固态硬盘 机械式磁盘结构磁盘&#xff0c;磁道&#xff0c;扇区柱面 文件系统的初始化划卷&#xff08;划盘&#xff09; 挂载C盘放了什么东西Boot Block&#xff08;启动模块&#xff09; 0号组放了什么东西Super Block&#xff08;超级…

Python爬取猫眼电影专业评分数据中的应用案例

在数据分析和可视化展示中&#xff0c;获取准确的电影专业评分数据至关重要。猫眼电影作为中国领先的电影信息与票务平台&#xff0c;其专业评分对于电影行业和影迷的数据来说具有重要意义。通过Python爬虫技术&#xff0c;我们可以实现从猫眼电影网站上自动获取这些数据目标。…

面试经典 150 题 ---- 删除排序数组中的重复项 II

面试经典 150 题 ---- 删除排序数组中的重复项 II [删除排序数组中的重复项 II](https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150)方法一&#xff1a;双指针 删除排序数组中的重复项 II …