UVa12345 UVa1465/LA4841 Searchlights

  • 题目链接
  • 题意
    • 输入格式
    • 输出格式
  • 分析
  • AC 代码

题目链接

  本题是2010年icpc亚洲区域赛杭州赛区的I题

题意

  在一个 n 行 m 列(n≤100,m≤10 000)的网格中有一些探照灯,每个探照灯有一个最大亮度 k(代表这个探照灯可以开到亮度 k, k-1, k-2, …, 1)。如果把一个探照灯开到亮度 L,它可以照亮上下左右各 L 个格子(L=1 表示它只能照亮它自己所在的格子)。下图示是一个开到亮度为3 的探照灯。
Searchlights
  你的任务是选择一些探照灯,把它们开到一个相同的亮度,使得所有格子被监控。为了节约能量,这个相同的亮度应尽量小。一个格子被监控的条件是:要么这个格子本身有一个开着的探照灯,要么这个格子同时被水平方向和垂直方向的探照灯照亮。

输入格式

  输入包含多组数据。每组数据第一行为两个整数 n 和 m,接下来 n 行每行 m 个整数描述各个网格处探照灯的最大亮度 ai,j{\large a}_{i,j}ai,j(数值可以为0,表示此网格无探照灯,ai,j≤10000{\large a}_{i,j} ≤ 10000ai,j10000)。最后一行两个 0 表示输入结束。

输出格式

  每组数据输出一行,如果存在满足条件的最小亮度则输出答案,否则输出“NO ANSWER!”。

分析

  比较难的区间覆盖问题,上加权并查集,水平方向和垂直方向分开考虑。

  首先可以想到把数值为 0 的相邻元素合并到一个区间,那么要覆盖此区间就只能在其两侧之外安排探照灯。如果区间两端都到达网格边界,则必然无解;如果仅一端到达网格边界,则可以在其另一端安排探照灯覆盖,探照灯亮度至少为区间长度 L 再加上 1(进而,如果另一端邻近的元素值 ≤ L,则无法保证覆盖,因此也需要将其合并进来);如果两端均未到达网格边界,则可以在其两端均安排探照灯覆盖,且两侧的探照灯亮度都至少为区间长度 L 的一半向上取整 ⌈L2⌉\lceil \frac L 2 \rceil2L。同样地,两侧都可安排探照灯时,探照灯亮度 < ⌈L2⌉\lceil \frac L 2 \rceil2L 的侧边也需要合并进来。以此类推,算法框架就出来了。

  1. 把所有元素从小到大排序,初始化每个元素为水平方向及垂直方向的并查集(权值均为 1 )、当前结果 v = 0 和答案 cc = 0。
  2. 遍历那些数值为 cc 的元素并将其合并进原始位置与之相邻且数值 ≤cc 的元素所在集合中,权值 w 为并查集的元素总数。遍历的过程中顺便判定是否无解和更新当前结果 v:
    • 当前元素所在水平方向集合权值达到 m 或者当前元素所在垂直方向集合权值达到 n 则无解(因为对应区间两侧都到边界了,没机会再安排探照灯覆盖了),算法结束。
    • 当前元素所在集合对应区间已经有一侧到边界,另一侧有机会安排探照灯覆盖,更新 v=max(v,w)v = max(v,w)v=max(v,w)
    • 当前元素所在集合对应区间两侧都没到边界,两侧都有机会安排探照灯覆盖,更新 v=max(v,⌈w2⌉)v = max(v,\lceil \frac w 2 \rceil )v=max(v,2w⌉)
  3. 那些数值为 cc 的元素都遍历到后,cc 自增 1:
    • 若 cc > v 则找到答案,算法结束。
    • 否则回到步骤 2

AC 代码

#include <iostream>
#include <algorithm>
using namespace std;#define M 10010
#define N 102
struct node {int a, x, y;} p[M*N]; int a[N][M], fx[M][N], fy[N][M], sx[M][N], sy[N][M], m, n, s;bool cmp(const node& u, const node& v) {return u.a < v.a;
}int find(int* f, int x) {return x == f[x] ? x : f[x] = find(f, f[x]);
}void merge(int* f, int* s, int x, int y) {int u = find(f, x), v = find(f, y);if (u == v) return;s[u] += s[v]; f[v] = u;
}void solve() {for (int i=s=0; i<n; ++i) for (int j=0; j<m; ++j)cin >> a[i][j], p[s++] = {a[i][j], i, j}, fx[j][i] = i, fy[i][j] = j, sx[j][i] = sy[i][j] = 1;sort(p, p+s, cmp);int c = 0;for (int i=0, cc=0; ; ++cc) {if (cc > c) {cout << cc << endl;return;}for (; i < s && p[i].a == cc; ++i) {int x = p[i].x, y = p[i].y;if (x > 0 && a[x-1][y] <= cc) merge(fx[y], sx[y], x, x-1);if (x+1 < n && a[x+1][y] < cc) merge(fx[y], sx[y], x, x+1);if (y > 0 && a[x][y-1] <= cc) merge(fy[x], sy[x], y, y-1);if (y+1 < m && a[x][y+1] < cc) merge(fy[x], sy[x], y, y+1);int u = find(fx[y], x), v = find(fy[x], y);if (sx[y][u] == n || sy[x][v] == m) {cout << "NO ANSWER!" << endl;return;}c = max(c, find(fx[y], 0) == u || find(fx[y], n-1) == u ? sx[y][u] : (sx[y][u]+1) >> 1);c = max(c, find(fy[x], 0) == v || find(fy[x], m-1) == v ? sy[x][v] : (sy[x][v]+1) >> 1);}}
}int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);while (cin >> n >> m && n) solve();return 0;
}

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

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

相关文章

详解区块链技术及主流区块链框架对比

文章目录一、区块链技术栈详解二、主流区块链框架对比1. 公有链&#xff08;Public Blockchain&#xff09;2. 联盟链&#xff08;Consortium Blockchain&#xff09;3. 私有链&#xff08;Private Blockchain&#xff09;三、技术选型建议1. 按需求选择框架2. 开发工具与生态四…

大模型 + 垂直场景:搜索 / 推荐 / 营销 / 客服领域开发有哪些新玩法?

技术文章大纲&#xff1a;大模型 垂直场景的新玩法大模型与搜索领域的结合大模型在搜索领域的应用可以显著提升搜索结果的准确性和用户体验。利用大模型进行语义理解和上下文关联&#xff0c;能够实现更精准的意图识别。结合知识图谱和动态索引优化&#xff0c;可以增强长尾查…

p5.js 3D盒子的基础用法

点赞 关注 收藏 学会了 如果你刚接触 p5.js&#xff0c;想尝试 3D 绘图&#xff0c;那么box()函数绝对是你的入门首选。它能快速绘制出 3D 长方体&#xff08;或正方体&#xff09;&#xff0c;配合简单的交互就能做出酷炫的 3D 效果。本文会从基础到进阶&#xff0c;带你吃…

【动态规划 完全背包 卡常】P9743 「KDOI-06-J」旅行|普及+

本文涉及知识点 C动态规划 完全背包 C记忆化搜索 「KDOI-06-J」旅行 题目描述 小 C 在 C 国旅行。 C 国有 nmn\times mnm 个城市&#xff0c;可以看做 nmn\times mnm 的网格。定义 (i,j)(i,j)(i,j) 表示在网格中第 iii 行第 jjj 列的城市。 该国有 222 种交通系统&#x…

pytest框架-详解

目录 一、前言 二、pytest安装 2.1、安装 2.2、验证安装 2.3、pytest文档 三、pytest框架的约束 3.1、 python的命名规则 3.2、 pytest的命名规则 四、pytest的运行方式 4.1、主函数运行 4.2、命令行运行 五、pytest配置文件pytest.ini文件 六、前置和后置 七、as…

【递归、搜索与回溯算法】DFS解决FloodFill算法

FloodFill算法简介一、[图像渲染](https://leetcode.cn/problems/flood-fill/description/)二、[岛屿数量](https://leetcode.cn/problems/number-of-islands/description/)三、[岛屿的最大面积](https://leetcode.cn/problems/max-area-of-island/description/)四、[被围绕的区…

解决网络传输中可能出现的“粘包”

先理解核心问题&#xff1a;什么是“TCP粘包”&#xff1f; TCP 就像一条水管&#xff0c;数据通过水管从一端传到另一端。但它有个特点&#xff1a;不会按“发送时的小包”来划分&#xff0c;而是把数据当成连续的字节流。 比如&#xff1a; 你分两次发数据&#xff1a;第一次…

Docker搭建RSS订阅服务(freshRss+rsshub)

目录搭建freshRss1. 创建yml文件2. 创建容器3. 检查容器状态&#xff0c;正常运行则搭建成功4. 浏览器访问并配置数据库5. 开始使用搭建RssHub1. 创建yml文件2. 创建容器3. 检查容器状态&#xff0c;正常运行则搭建成功4. 浏览器访问生成RSS路由&#xff08;订阅地址&#xff0…

Spring 条件注解与 SPI 机制(深度解析)

在 Spring 及 Spring Boot 框架中&#xff0c;条件注解与 SPI 机制扮演着至关重要的角色&#xff0c;它们是实现自动配置、灵活控制 Bean 创建以及组件按需加载的关键所在。深入理解它们的底层实现与应用场景&#xff0c;既能帮助我们在面试中对答如流&#xff0c;又能在实际开…

Mac(二)Homebrew 的安装和使用

官网地址&#xff1a; https://brew.sh/官方文档&#xff1a; https://docs.brew.sh/Manpage Homebrew 是 macOS 上最强大的包管理器&#xff0c;让你轻松安装、更新和管理成千上万的开发工具、命令行程序&#xff08;如 wget, tree, ffmpeg&#xff09;甚至图形应用&#xff0…

Vue 侦听器(watch 与 watchEffect)全解析2

二、watchEffect:自动追踪依赖的侦听器 watchEffect 是更“简洁”的侦听器:它不需要手动指定数据源,而是自动追踪回调中用到的响应式状态——当这些状态变化时,自动触发回调。适用于“副作用与依赖绑定紧密”的场景(如依赖较多、无需区分新旧值)。 1. 基本用法(与 wat…

正点原子STM32H743配置 LTDC + DMA2D

开发板 正点原子STM32H743 阿波罗固件包 STM32Cube MCU Package for STM32H7 1.12.1开发工具 STM32CubeMX STM32CubeIDE根据原理图适配所有GPIO&#xff0c;并设置所有GPIO速度 Very Hight

北京JAVA基础面试30天打卡10

1.最佳左前缀原则是什么 Q:什么是MySQL索引I的最左匹配原则&#xff1f; A:最左匹配原则是指&#xff0c;在复合索引引中&#xff0c;查询条件需要按照索引列的顺序从最左侧列开始依次匹配。只有查询条件中的列按照索引的最左边列开始进行匹配,索引引才能被有效使用。 Q:能否举…

五、ZooKeeper、Kafka、Hadoop、HBase、Spark、Flink集群化软件的部署

五、ZooKeeper、Kafka、Hadoop、HBase、Spark、Flink集群化软件的部署 文章目录五、ZooKeeper、Kafka、Hadoop、HBase、Spark、Flink集群化软件的部署1.作用主要作用&#xff08;通俗说法&#xff09;对实战项目有什么用&#xff1f;&#xff08;直接举例&#xff09;2.集群化软…

下载及交叉编译glib,记录

下载及交叉编译glib&#xff0c;记录 编译参见这篇博客 嵌入式arm交叉编译移植bluez5.0最新教程_bluez移植-CSDN博客 编译命令有更新&#xff1a; make -j4 CFLAGS"-Wno-format-overflow" glib库的作用&#xff1a; glib 是 GNOME 项目下的一个基础库&#xff0c…

从 0 到 1 玩转Claude code(蓝耘UI界面版本):AI 编程助手的服务器部署与实战指南

前言 蓝耘 Coding UI 作为基于 Claude Code 的可视化工具&#xff0c;凭借对本地项目的深度掌控、与 Git 仓库的无缝衔接以及直观的交互界面&#xff0c;正在重构开发者的工作流。本文将带你一步步完成从环境搭建到实战使用的全流程&#xff0c;让这款工具真正成为你的编程「副…

docker使用指定的MAC地址启动podman使用指定的MAC地址启动

docker指定固定的mac地址 1】创建自定义桥接网络并配置 MAC 地址保留 docker network create --driver bridge custom_bridge2】启动容器并指定使用自定义网络 docker run -it --name your-container --network custom_bridge --mac-address 02:42:ac:11:00:02 your-image--mac…

抽奖程序web程序

使用html实现抽奖程序&#xff0c;没有后台&#xff0c;如果需要后续写个后台可以配置&#xff0c;没有过多的介绍&#xff0c;看代码吧 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>婚礼抽奖</…

【Python办公】Excel转json(极速版)-可自定义累加字段(如有重复KEY)

目录 专栏导读 🎯 亮点特性 ⚙️ 安装与运行 🖥️ 界面与区域说明 🚀 使用示例 💡 使用建议 ❓ 常见问题(FAQ) 🧱 技术要点 完整代码 🏁 结语 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——…

JavaScript 防抖(Debounce)与节流(Throttle)

在 JavaScript 前端开发中&#xff0c;处理高频率事件&#xff08;如窗口调整、输入框输入、页面滚动&#xff09;时&#xff0c;如果不加以控制&#xff0c;会导致性能问题&#xff0c;如页面卡顿或资源浪费。防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle…