题解:P14299 [JOI2023 预选赛 R2] 填充 / Painting

news/2025/10/24 20:16:15/文章来源:https://www.cnblogs.com/Noivelist/p/19164136

\(\displaystyle \large {题目传送门}\)

题面

给定一个一个 H*W 的矩形 , 每个坐标上有一个颜色 , 上下左右相邻的同颜色节点可以形成连通块 。
你可以对任意一个连通块 , 进行一次并仅有一次的染色 , 求新形成的连通块最大的大小 。

思路:

\(\mathcal Step\ 1:\)

我们既然要对连通块做操作 , 那怎么有不求出所有连通块的理由呢 ?
问题是我们要对求出的连通块做些什么 ?
$\ $
扫图的过程中 , 对于没有搜到过的点 , 我们通过广搜确定这个连通块 。
先预处理出这个连通块所代表的编号 、 大小 、 代表点(这个很重要)。
搜的过程中 , 我们统计当前连通块的大小 , 并对搜到的所有合法的在当前连通块中的点进行染色 , 以便我们第二遍的时候能够快速确定一些当前连通块的信息 。

\(\mathcal Step\ 2:\)

接下来 , 我们发现这道题的数据很小 (是道绿色水题) , 所以我们直接考虑对每个连通块枚举 。然后的操作是第二遍 BFS , 这次有所不同 。
$\ $
我们从代表点出发(这不就用到了?), 寻找它的边界 , 如果找到了一个接壤的连通块 , 那就可以得到它的大小 和颜色, 并且给它打一个 “搜过了” 的标记 。
$\ $
对于得到的数据 , 我们考虑对于每一种颜色丢一个桶 , 统计某色连通块的大小和 , 因为只要当前连通块改为某种颜色 , 那么所有和它接壤的这种颜色的连通块都可以被它吸收 。
$\ $
如果每种颜色丢桶 , 然后再一个一个遍历再查询最大值 , 或许有损它绿题的称号(虽然也能过) , 我们考虑在遍历过程中直接把这个得到的数据丢进优先队列 , 搜完以后再直接取堆顶 。
$\ $
于是乎 , 当前连通块加上堆顶就是这次查询的局部最优解 , 我们和答案取个最大值就可以进行下一次枚举了 。
千万不要忘记判断优先队列为空的情况!


\(\displaystyle \mathcal {C_OD}\large {^E}\)

#include<bits/stdc++.h>
using namespace std;const int N = 505;//四向移动 
const int dx[] = {0, 1, -1, 0, 0};
const int dy[] = {0, 0, 0, 1, -1};int h, w;
int a[N][N];				//记录图的原始输入 
int vis[N][N];  			//bfs时的访问 
int cid[N][N];  			//连通块 的 编号 
int csz[N * N]; 			//连通块 的 大小 
int ccl[N * N]; 			//连通块 的 颜色 
int cnt;                    //连通块 的 数量 
pair<int, int> rep[N * N];  //连通块 的 代表点 
int ans = 0;void bfs(int sx, int sy) {queue<pair<int, int>> q; //队列记录坐标 q.push({sx, sy});vis[sx][sy] = 1;cnt++; //新建连通块编号 int col = a[sx][sy]; //记录颜色 int sz = 0; //初始化大小 rep[cnt] = {sx, sy}; //记录代表点 while (!q.empty()) {int x = q.front().first;int y = q.front().second;q.pop();cid[x][y] = cnt; //每个坐标都可以查询到它所处的连通块 sz++;for (int i = 1; i <= 4; i++) {int nx = x + dx[i];int ny = y + dy[i];//边界条件 if (nx < 1 || nx > h || ny < 1 || ny > w) continue;//连通性 if (vis[nx][ny] || a[nx][ny] != col) continue;vis[nx][ny] = 1;q.push({nx, ny});}}csz[cnt] = sz;ccl[cnt] = col;//存储数据 
}void BFS(int i){int sx = rep[i].first;int sy = rep[i].second;//用来统计特定颜色邻块的大小和 priority_queue<int> pq; //统计颜色大小 map<int, int> color_sum;//防止重复统计 unordered_set<int> counted;queue<pair<int, int>> q;q.push({sx, sy});//防止坐标重复访问 unordered_set<int> visited;//不要忘记初始化 visited.insert(sx * w + sy);while (!q.empty()) {int x = q.front().first;int y = q.front().second;q.pop();for (int k = 1; k <= 4; k++) {int nx = x + dx[k];int ny = y + dy[k];//边界条件 if (nx < 1 || nx > h || ny < 1 || ny > w) continue;int nid = cid[nx][ny];if (nid == i) {// 同一连通块,继续探索int key = nx * w + ny;if (visited.count(key)) continue;visited.insert(key);q.push({nx, ny});} else {// 不同连通块,统计大小if (!counted.count(nid)) {color_sum[ccl[nid]] += csz[nid]; //累计大小 pq.push(color_sum[ccl[nid]]); // 将颜色总和加入优先队列counted.insert(nid);}}}}if (!pq.empty()) { //取出堆顶,统计最终大小 ans = max(ans, csz[i] + pq.top());}else{ans = max(ans, csz[i]);}
} int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin >> h >> w;for (int i = 1; i <= h; i++) {for (int j = 1; j <= w; j++) {cin >> a[i][j];}}// 第一步:识别所有连通块for (int i = 1; i <= h; i++) {for (int j = 1; j <= w; j++) {if (!vis[i][j]) {bfs(i, j);}}}// 第二步:从代表点出发进行边界探索for (int i = 1; i <= cnt; i++) {BFS(i);}cout << ans << endl;return 0;
}

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

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

相关文章

Devolutions Server权限提升漏洞分析与修复指南

本文详细分析了CVE-2025-11957漏洞,该漏洞存在于Devolutions Server 2025.2.12.0及更早版本中,由于临时访问工作流程的授权机制存在缺陷,允许经过身份验证的基本用户通过精心构造的API请求自我批准或批准其他用户的…

AI股票预测分析报告 - 2025年10月24日 - 20:08:50

AI股票预测分析报告 - 2025年10月24日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-width: 1…

在 Astro 博客中优雅使用 51.la 统计数据

在 Astro 博客中使用 51.la 免费流量统计,通过解析 widget JS 自行渲染访问数据,既保留统计功能,又可自定义展示,让你直观了解博客访客情况作为老牌网站流量统计服务商,51.la 提供每月高达 1000 万次的免费统计额…

申威服务器安装Java11(swjdk-11u-9.ky10.sw_64.rpm)详细操作步骤(附安装包)

申威服务器安装Java11(swjdk-11u-9.ky10.sw_64.rpm)详细操作步骤(附安装包)​这是申威架构(国产芯片,常见于Kylin V10等国产系统)专用的 ​Java 11 版本(RPM安装包)​,包名为 java-11.0.7-swjdk-11u-9.ky10.…

str.endswith() 类似的方法

在Python中,与str.endswith()类似的方法(主要涉及字符串的开头/结尾检查、子串搜索等)有很多,以下是核心方法及其功能对比: 1. 开头检查:str.startswith()功能:检查字符串是否以指定前缀开头,返回True/False。…

深度剖析OpenHarmony AI Engine:开发板端侧大模型推理插件机制全链路拆解 - 实践

深度剖析OpenHarmony AI Engine:开发板端侧大模型推理插件机制全链路拆解 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

Linux下的拼音输入法 (3)

此贴简介libgooglepinyin-0.1.2,刚看了几分钟(持续更新中): data/下: 730 2012年 2月 3日 CMakeLists.txt227 2012年 2月 3日 googlepinyin.pc.in3.5M 2012年 2月 3日 rawdict_utf16_65105_freq.be.txt3.5M 2012年…

P2606 [ZJOI2010] 排列计数 分析

题目概述 题目链接:https://www.luogu.com.cn/problem/P2606。 称一个 \(1 \sim n\) 的排列 \(p_1,p_2, \dots ,p_n\) 是 Magic 的,当且仅当 \[\forall i \in [2,n],p_i > p_{\lfloor i/2 \rfloor} \]计算 \(1 \s…

实用指南:MacOS - Clang使用bits/stdc++.h - 非官方(竞赛用) - 通用方法

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

cgroup

cgroupcgroup v1使用流程: mount -t tmpfs cgroup_root /sys/fs/cgroup mkdir -p /sys/fs/cgroup/cpu mkdir -p /sys/fs/cgroup/memory mount -t cgroup -o cpu none /sys/fs/cgroup/cpu mount -t cgroup -o memory n…

设计模式:代码界的 “光之巨人” 养成指南(附 C++ 实战)

参考 https://bbs.huaweicloud.com/blogs/397606 https://refactoring.guru/design-patterns/catalog 一、概述 1.1、什么是设计模式 官方定义说得有点绕:“一套被反复使用、多数人知晓、分类编目的代码设计经验总结”…

详细介绍:17-Language Modeling with Gated Convolutional Networks

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

数字人:数字人公司排行榜及技术深度剖析

数字人企业:探索虚拟与现实的融合新纪元 数字人企业的创新之路与市场机遇解析 数字人企业排行榜及技术深度剖析 正文: 在当今科技飞速发展的时代,数字人企业正成为推动数字化转型的重要力量。它们不仅重塑了人机交互…

【同余最短路】学习笔记

例题 \(1\):P3403 跳楼机:给定正整数 \(h,x,y,z\),求有多少 \(d\in[1,h]\) 满足 \(ax+by+cz=d-1\),其中 \(a,b,c\) 为非负整数。这道题第一眼给我的印象是一道数论题,但仔细想了想发现做不了。注意到 \(x,y,z\) 的…

ESP32-S3入门第七天:UART串口通信与设备交互 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

数字人:数字人公司深度解析与未来展望

数字人企业 数字人企业新趋势:虚拟与现实的融合探索 数字人企业深度解析与未来展望 在当今科技飞速发展的时代,数字人企业正成为推动创新与变革的重要力量。数字人,作为虚拟与现实交互的桥梁,不仅改变了人机交互的…

CSP/NOIP 复习:单调栈

最近模拟赛打的都不是太好,先随便复习复习吧,马上就要 CSPS 了,我可以考好的。 这里放一些单调栈的题目,笛卡尔树先不说,这个我已经忘了,后天复习一下。 本体 栈中维护有单调性的数据,入栈时维护这个单调性,这…

数字人企业:数字人公司排行榜深度解析

数字人企业新纪元:创新科技重塑未来生态 探秘数字人企业的核心驱动力与市场前景 数字人企业排行榜深度解析与趋势洞察 正文: 在数字化浪潮席卷全球的今天,数字人企业正成为科技领域的一颗新星,推动着虚拟与现实的深…

数字人公司:数字人新趋势技术驱动与市场前景解析

数字人企业 数字人企业新趋势:技术驱动与市场前景解析 数字人企业排行榜与深度点评 在当今科技飞速发展的时代,数字人企业正成为人工智能和虚拟交互领域的热门焦点。这些企业通过创新技术,推动着虚拟数字人在娱乐、…