UVa1465/LA4841 Searchlights

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,j?10000)。最后一行兩個 0 表示輸入結束。

輸出格式

??每組數據輸出一行,如果存在滿足條件的最小亮度則輸出答案,否則輸出“NO ANSWER!”。

分析

??比較難的區間覆蓋問題,上加權并查集,水平方向和垂直方向分開考慮。

??首先可以想到把數值為 0 的相鄰元素合并到一個區間,那么要覆蓋此區間就只能在其兩側之外安排探照燈。如果區間兩端都到達網格邊界,則必然無解;如果僅一端到達網格邊界,則可以在其另一端安排探照燈覆蓋,探照燈亮度至少為區間長度 L 再加上 1(進而,如果另一端鄰近的元素值 ≤ L,則無法保證覆蓋,因此也需要將其合并進來);如果兩端均未到達網格邊界,則可以在其兩端均安排探照燈覆蓋,且兩側的探照燈亮度都至少為區間長度 L 的一半向上取整 ?L2?\lceil \frac L 2 \rceil?2L??。同樣地,兩側都可安排探照燈時,探照燈亮度 < ?L2?\lceil \frac L 2 \rceil?2L?? 的側邊也需要合并進來。以此類推,算法框架就出來了。

  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…