洛谷P1514 [NOIP 2010 提高组] 引水入城

洛谷题目传送门

题目背景

NOIP2010 提高组 T4

题目描述

在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政区划十分特殊,刚好构成一个 NNNMMM 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度。

为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中。

因此,只有与湖泊毗邻的第 111 行的城市可以建造蓄水厂。而输水站的功能则是通过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。由于第 NNN 行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干旱区中不可能建有水利设施的城市数目。

输入格式

每行两个数,之间用一个空格隔开。输入的第一行是两个正整数 N,MN,MN,M,表示矩形的规模。接下来 NNN 行,每行 MMM 个正整数,依次代表每座城市的海拔高度。

输出格式

两行。如果能满足要求,输出的第一行是整数 111,第二行是一个整数,代表最少建造几个蓄水厂;如果不能满足要求,输出的第一行是整数 000,第二行是一个整数,代表有几座干旱区中的城市不可能建有水利设施。

输入输出样例 #1

输入 #1

2 5
9 1 5 4 3
8 7 6 1 2

输出 #1

1
1

输入输出样例 #2

输入 #2

3 6
8 4 5 6 4 4
7 3 4 3 3 3
3 2 2 1 1 2

输出 #2

1
3

说明/提示

样例 1 说明

只需要在海拔为 999 的那座城市中建造蓄水厂,即可满足要求。

样例 2 说明

上图中,在 $3 $ 个粗线框出的城市中建造蓄水厂,可以满足要求。以这 $3 $ 个蓄水厂为源头在干旱区中建造的输水站分别用 333 种颜色标出。当然,建造方法可能不唯一。

数据范围

本题有 10 个测试数据,每个数据的范围如下表所示:

测试数据编号能否满足要求N≤N\leNM≤M\leM
1不能101010101010
2不能100100100100100100
3不能500500500500500500
4111101010
5101010101010
6100100100202020
7100100100505050
8100100100100100100
9200200200200200200
10500500500500500500

对于所有 10 个数据,每座城市的海拔高度都不超过 10610^6106

思路详解

我们发现,一条河流可以流到的干旱城市是固定的,考虑直接将他预处理出来。我们发现倘使一条河流对应一个连续区间,那我们直接贪心即可,但如果不呢???如果问题不能解决,那考虑如何解决掉问题。考虑如何证明一定是一条连续区间。

连续区间

对于无解的情况,我们肯定不需要讨论,因为我们可以直接标记。那对于有解的情况,如何证明每个河流对应的一定是一个连续区间的。考虑使用反证法,如下图:
在这里插入图片描述
假如xxx可以流到下端蓝线除了红点的城市,由于有解,则必有如下城市可以到达红点:
在这里插入图片描述
我们发现xxxyyy的流径一定有交点,不然yyy不可能凭空到达红点。那么你yyy都可以走,则xxx肯定可以走到,那xxx流经地区一定是一个连续区间,那接下来就好办了。

大致思路

大致思路如下:

  1. 我们先以每个河流为起点,深搜求解每个河流可以流经的区间。
  2. 然后在检查干旱城市是否都可以被灌溉,如果不是统计有多少个,输出即可。
  3. 如果都可以,则对应每个区间,我们以已有区间右边界的右边一个为起点,若新区间的的左端点小于等于起点,则取右端点的最大值为新的右边界。

code:

#include<bits/stdc++.h>
using namespace std;
const int N=505;
int n,m;
int a[N][N],vis[N][N];
struct node{int x,y;
}c[N][N];//c[i][j]为从(i,j)开始可以流到的区间
int dx[5]={0,0,1,-1};
int dy[5]={1,-1,0,0};
int jsq=0;
void dfs(int bx,int by){//深搜求解vis[bx][by]=1;for(int i=0;i<4;i++){auto [qx,qy]=(node){bx+dx[i],by+dy[i]};if(qx<1||qx>n||qy<1||qy>m||a[qx][qy]>=a[bx][by])continue;if(!vis[qx][qy]){//注意,访问过的点也可以更新他的值vis[qx][qy]=1;dfs(qx,qy);}c[bx][by].x=min(c[bx][by].x,c[qx][qy].x);c[bx][by].y=max(c[bx][by].y,c[qx][qy].y);}
}
int ans=0;
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)c[i][j].x=0x3f3f3f3f;}//赋初值for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];if(i==n)c[i][j]={j,j};//边界}}for(int i=1;i<=m;i++){//枚举并深搜if(!vis[1][i])dfs(1,i);}for(int i=1;i<=m;i++)if(!vis[n][i])ans++;//记录有多少个点流不到if(ans>0){//有城市流不到cout<<0<<'\n'<<ans;}else{cout<<1<<'\n';ans=0;int l=1,r=0;while(l<=m){//贪心for(int i=1;i<=m;i++){if(c[1][i].x<=l)r=max(r,c[1][i].y);}l=r+1;ans++;}cout<<ans;}return 0;
}

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

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

相关文章

【unity小技巧】国内Unity6下载安装和一些Unity6新功能使用介绍

文章目录前言一、安装1、国外下载2、国内下载二、常用的新功能变化1、官方推荐使用inputsystem进行输入控制2、修复了InputSystem命名错误导致listen被遮挡的bug3、自带去除unity启动画面logo功能4、unity官方的behavior行为树插件5、linearVelocity代替过时的velocity方法6、随…

Rust 中字符串类型区别解析

在 Rust 中&#xff0c;"hello" 和 String::from("hello") 都表示字符串&#xff0c;但它们在内存表示、所有权和可变性上有本质区别&#xff1a;1. 类型与内存表示"hello" (字符串字面量)&#xff1a;类型为 &str&#xff08;字符串切片引用…

springMVC05-异常处理器

在 SpringMVC 中&#xff0c;异常处理是一个非常重要的功能&#xff0c;它可以让你优雅地处理程序抛出的各种异常&#xff0c;向用户展示友好的提示&#xff0c;而不是显示一堆报错信息&#xff08;如 500 页面&#xff09;。一、SpringMVC的异常处理器返回的是ModelAndView&am…

安装 Elasticsearch IK 分词器

安装 Elasticsearch IK 分词器&#xff08;手动 .zip/.zip 安装&#xff09; IK 分词器&#xff08;IK Analysis&#xff09;是 Elasticsearch 最常用的中文分词插件&#xff0c;支持 细粒度分词&#xff08;ik_max_word&#xff09; 和 智能切分&#xff08;ik_smart&#xf…

数据库系统原理实验1:创建数据库、数据表及单表查询

一、实验目的1&#xff0e;掌握在SQL Server中使用对象资源管理器和SQL命令创建数据库与修改数据库的方法。2&#xff0e;掌握在SQL Server中使用对象资源管理器或者SQL命令创建数据表和修改数据表的方法&#xff08;以SQL命令为重点&#xff09;。3&#xff0e;掌握无条件查询…

【STM32】ADC模数转换基本原理(提供完整实例代码)

这篇文章是嵌入式中我通过大量资料 整合成了一份 系统完整、层次清晰的 ADC 模数转换原理解析 文档。 这里系统地梳理了 STM32F1 系列 ADC 模数转换的核心资料&#xff0c;包括&#xff1a; 1.原理 特性 2.通道配置 3.模式选择&#xff08;单次/连续/扫描&#xff09; 4.关键寄…

图神经网络 gnn 应用到道路网络拓扑结构与交通碳排放相关性。,拓扑指标量化、时空关联模型及演化机制分析

针对您提出的“道路网络拓扑结构与交通碳排放相关框架&#xff0c;以下结合研究目标、数据与方法进行系统性深化设计&#xff0c;重点强化拓扑指标量化、时空关联模型及演化机制分析&#xff1a;一、核心研究问题深化 静态关联&#xff1a;不同拓扑结构&#xff08;方格网/环射…

7.6 优先队列| dijkstra | hash | rust

lc1337pair存入&#xff0c;lambda sort后取出&#xff0c;最开始想用hash&#xff0c;写一半感觉写复杂了class Solution {public:vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {int m mat.size();int n mat[0].size();vector<pair…

最新 HarmonyOS API 20 知识库 重磅推出

最新 HarmonyOS API 20 知识库 重磅推出 前言 最近整理下 华为开发者联盟最新的 API 20的鸿蒙应用开发文档&#xff0c;这次的API 20 相比较之前的文档&#xff0c;要多了不少内容&#xff0c;目前整理后是9000千多篇&#xff0c;不容易呀。 如何使用 基于腾讯的知识库工具 …

uniapp 监听物理返回按钮

import {onShow,onHide,onLoad,onReady,onBackPress} from "dcloudio/uni-app"onBackPress((e) > {showLog("返回按钮触发")if(e.frombackbutton){//开始干活}})参数说明属性类型说明fromString触发返回行为的来源&#xff1a;backbutton——左上角导航…

多线程(2)

多线程&#xff08;2&#xff09; &#x1f534;&#x1f7e0;&#x1f7e1;&#x1f7e2;&#x1f535;&#x1f7e3;&#x1f534;&#x1f534;&#x1f7e0;&#x1f7e1;&#x1f7e2;&#x1f535;&#x1f7e3;&#x1f534;&#x1f534;&#x1f7e0;&#x1f7e1;&am…

网关助力航天喷涂:Devicenet与Modbus TCP的“跨界对话“

在航空航天领域&#xff0c;飞机、航天器的制造过程有着极高的精度与安全性要求。以飞机、航天器表面喷涂作业为例&#xff0c;不仅要进行严格的防腐蚀处理&#xff0c;而且对表面光滑度要求极高&#xff0c;这直接关系到飞行器的空气动力学性能和使用寿命。为确保作业安全与质…

从传统项目管理到敏捷DevOps:如何转向使用DevOps看板工具进行工作流管理

在DevOps实践中&#xff0c;DevOps看板工具成为了开发与运维团队之间高效协作的关键。随着企业对敏捷开发和持续交付的需求日益增长&#xff0c;DevOps看板工具通过可视化的管理方法&#xff0c;帮助团队在繁杂的任务中保持高效的工作节奏和清晰的进度跟踪。 具体而言&#xff…

【leetcode100】下一个排列

1、题目描述 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正…

Flink-Source算子状态恢复分析

背景 修改 source 算子 kafka_old_topic 消费任务运行一段时间后&#xff0c;暂停状态并保留。然后将 uid 和 topic 都改了&#xff0c;消费者 offset 会从 earliest 开始。 // before FlinkKafkaConsumer consumer KafkaConfig.getConsumer("kafka_old_topic");…

IDEA中application.yml配置文件不自动提示解决办法

今天在自己的电脑上使用IDEA的时候&#xff0c;发现在application配置文件里面输入配置项的时候没有提示&#xff0c;网上找了一圈也没解决&#xff0c;最后自己试出来了。 解决办法&#xff1a; 鼠标移动到配置文件上&#xff0c;单击右键-重写文件类型、选择YAML(捆绑)&#…

Vite 完整功能详解与 Vue 项目实战指南

Vite 完整功能详解与 Vue 项目实战指南 Vite 是下一代前端开发工具&#xff0c;由 Vue 作者尤雨溪开发&#xff0c;提供极速的开发体验和高效的生产构建。以下是完整功能解析和实战示例&#xff1a;一、Vite 核心功能亮点闪电般冷启动 基于原生 ES 模块&#xff08;ESM&#xf…

Vue 3 中使用路由参数跳转时 watch 触发重复请求问题详解

&#x1f4d8;Vue 3 中使用路由参数跳转时 watch 触发重复请求问题详解&#x1f516; 收藏 点赞 关注&#xff0c;掌握 Vue 3 路由参数监听中的隐藏陷阱&#xff0c;避免详情页、嵌套路由页误触发重复请求&#xff01;&#x1f9e9; 一、问题背景 在 Vue 3 项目中&#xff0c…

前端 项目更新通知 (plugin-web-update-notification)

项目版本更新迭代时&#xff0c;需提示用户更新系统&#xff0c;不然早时间不更新对用户体验很不好&#xff0c;所以在每次部署后需要提示用户&#xff0c;刷新静态资源。推荐插件 plugin-web-update-notification .具体配置 vite.config.js文件中 import { webUpdateNotice …

【力扣(LeetCode)】数据挖掘面试题0002:当面对实时数据流时您如何设计和实现机器学习模型?

文章大纲一、实时数据处理&#xff1a;构建低延迟的数据管道1. 数据接入与缓冲2. 实时清洗与校验3. 特征标准化与对齐二、模型设计&#xff1a;选择适配实时场景的模型架构1. 模型选择原则三、训练与更新策略&#xff1a;离线与在线协同&#xff0c;应对概念漂移1. 离线-在线协…