news 2026/1/31 7:10:36

UVa 12663 High Bridge Low Bridge

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 12663 High Bridge Low Bridge

题目描述

河上有nnn座桥,每座桥有一个高度hih_ihi。河水会泛滥mmm次,每次洪水会将水位从上次洪水结束后的高度bi−1b_{i-1}bi1上升到aia_iai,然后回落到bib_ibi。初始水位为111

题目规定:如果一座桥在洪水结束后仍然在水下(即水位不低于桥的高度),那么下次洪水时它不会被视为再次被淹。也就是说,每次洪水只记录上升阶段(水位从bi−1b_{i-1}bi1上升到aia_iai期间)被淹的桥。

给定nnn座桥的高度和mmm次洪水的数据,求有多少座桥至少被淹了kkk次。

输入格式

输入最多包含252525个测试用例。每个测试用例的第一行包含三个整数n,m,kn, m, kn,m,k1≤n,m,k≤1051 \leq n, m, k \leq 10^51n,m,k105)。第二行包含nnn个整数hih_ihi,表示每座桥的高度(2≤hi≤1082 \leq h_i \leq 10^82hi108)。接下来的mmm行每行包含两个整数aia_iaibib_ibi1≤bi<ai≤108,ai>bi−11 \leq b_i < a_i \leq 10^8, a_i > b_{i-1}1bi<ai108,ai>bi1)。整个输入的文件大小不超过5MB5\text{MB}5MB

输出格式

对于每个测试用例,输出至少被淹了kkk次的桥的数量。

题目分析

核心逻辑

对于第iii次洪水:

  • 洪水开始前的水位是bi−1b_{i-1}bi1(第一次洪水前b0=1b_0 = 1b0=1
  • 水位上升到aia_iai
  • 然后回落到bib_ibi

桥被淹的条件:在上升阶段,水位超过了桥的高度,即bi−1<h≤aib_{i-1} < h \leq a_ibi1<hai
为什么不是bib_ibi因为下降阶段不影响本次是否被淹的记录,只影响下次洪水是否算作“再次被淹”。

关键点

  1. 只考虑上升阶段:题目描述中的文字游戏关键就在于,下降阶段不影响计数,只影响下次判断。
  2. 区间更新:对于每次洪水,需要给所有高度在(bi−1,ai](b_{i-1}, a_i](bi1,ai]范围内的桥的计数+1+1+1
  3. 高效处理:直接遍历每座桥更新会超时(O(nm)O(nm)O(nm)),需要使用差分技巧。

算法步骤

  1. 将桥的高度排序,以便二分查找。
  2. 使用差分数组记录每座桥被淹的次数。
  3. 遍历每次洪水:
    • 用二分查找找到高度>bi−1> b_{i-1}>bi1的第一个桥的索引leftleftleft
    • 用二分查找找到高度≤ai\leq a_iai的最后一个桥的索引rightrightright
    • 如果left≤rightleft \leq rightleftright,则在差分数组中标记区间[left,right][left, right][left,right]111
  4. 通过差分数组前缀和计算每座桥的实际被淹次数。
  5. 统计次数≥k\geq kk的桥的数量。

时间复杂度

  • 排序桥高度:O(nlog⁡n)O(n \log n)O(nlogn)
  • 每次洪水二分查找:O(log⁡n)O(\log n)O(logn),总O(mlog⁡n)O(m \log n)O(mlogn)
  • 前缀和统计:O(n)O(n)O(n)
  • 总复杂度:O((n+m)log⁡n)O((n+m) \log n)O((n+m)logn),可以处理10510^5105的数据规模。

空间复杂度

  • 存储桥高度和差分数组:O(n)O(n)O(n)

代码实现

// High Bridge Low Bridge// UVa ID: 12663// Verdict: Accepted// Submission Date: 2025-12-23// UVa Run Time: 0.040s//// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constintMAXN=100010;intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intcaseNo=1;intn,m,k;intbridgeHeight[MAXN],diff[MAXN];inta,b;while(cin>>n>>m>>k){for(inti=0;i<n;i++){cin>>bridgeHeight[i];diff[i]=0;}sort(bridgeHeight,bridgeHeight+n);intlastWaterLevel=1;// 初始水位为1,也是第一次洪水前的b₀for(inti=0;i<m;i++){cin>>a>>b;// 本次洪水影响:高度在 (lastWaterLevel, a] 范围内的桥// 使用 upper_bound 找到第一个 > lastWaterLevel 的桥// 使用 upper_bound 找到第一个 > a 的桥,然后-1得到最后一个 ≤ a 的桥intleft=upper_bound(bridgeHeight,bridgeHeight+n,lastWaterLevel)-bridgeHeight;intright=upper_bound(bridgeHeight,bridgeHeight+n,a)-bridgeHeight-1;if(left<=right){diff[left]++;diff[right+1]--;}lastWaterLevel=b;// 更新为本次洪水结束后的水位}// 计算每座桥被淹的次数intcurrentFloodCount=0;intanswer=0;for(inti=0;i<n;i++){currentFloodCount+=diff[i];if(currentFloodCount>=k)answer++;}cout<<"Case "<<caseNo++<<": "<<answer<<'\n';}return0;}

样例解释

样例111

输入: 2 2 2 2 5 6 2 8 3
  • 桥高度:2,52, 52,5
  • 111次洪水:影响(1,6](1, 6](1,6]→ 桥2,52, 52,5+1+1+1
  • 222次洪水:影响(2,8](2, 8](2,8]→ 桥555+1+1+1(桥222高度为222,不在(2,8](2,8](2,8]区间)
  • 统计:桥222被淹111次,桥555被淹222
  • 输出:111(只有桥555被淹≥2\geq 22次)

样例222

输入: 5 3 2 2 3 4 5 6 5 3 4 2 5 2
  • 桥高度:2,3,4,5,62, 3, 4, 5, 62,3,4,5,6
  • 111次洪水:影响(1,5](1, 5](1,5]→ 桥2,3,4,52,3,4,52,3,4,5+1+1+1
  • 222次洪水:影响(3,4](3, 4](3,4]→ 桥444+1+1+1
  • 333次洪水:影响(2,5](2, 5](2,5]→ 桥3,4,53,4,53,4,5+1+1+1
  • 统计:桥2:12:12:1次,桥3:23:23:2次,桥4:34:34:3次,桥5:25:25:2次,桥6:06:06:0
  • 输出:333(桥3,4,53,4,53,4,5被淹≥2\geq 22次)

总结

本题的关键在于理解题目描述中的文字游戏:每次洪水只记录上升阶段被淹的桥,下降阶段只影响下次是否算作“再次被淹”
通过将桥高度排序并使用差分技巧,可以高效地处理区间更新问题。
注意数据范围较大,需要使用O((n+m)log⁡n)O((n+m) \log n)O((n+m)logn)的算法才能通过。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/26 8:28:13

Windows系统文件msrdo20.dll丢失找不到 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/1/28 5:29:19

放弃3D打印“Uber”梦,如今用户破10万,做AI平台更靠谱

把3D打印与AI设计平台化&#xff0c;或许值得一试。近日&#xff0c;人工智能驱动的3D设计平台PrintPal宣布&#xff0c;自2025年4月上线以来&#xff0c;仅用八个月时间&#xff0c;平台注册用户已突破10万。 用户可通过文本或图像生成可打印的三维模型&#xff0c;操作流程极…

作者头像 李华
网站建设 2026/1/29 6:56:55

Vue customRef

customRef 是 Vue 3 中的一个高级响应式 API&#xff0c;用于创建自定义的响应式引用&#xff08;ref&#xff09;&#xff0c;允许开发者对依赖追踪和更新触发过程进行细粒度控制。它通过一个工厂函数接收 track 和 trigger 两个函数&#xff0c;返回一个包含 get 和 set 方法…

作者头像 李华
网站建设 2026/1/30 13:58:48

隧道超声波风速风向检测器:优化通风能耗管理

隧道超声波风速风向检测器通过实时监测与智能调控&#xff0c;显著优化通风能耗管理&#xff0c;其核心价值体现在以下方面&#xff1a; 一、技术原理&#xff1a;高精度测量奠定能耗优化基础 隧道超声波风速风向检测器采用超声波时差法&#xff0c;通过测量超声波在顺风与逆…

作者头像 李华
网站建设 2026/1/30 16:06:50

STM32单片机温控风扇温度采集PWM调速设计

摘 要 本设计为 “基于 32 单片机温控风扇温度采集 PWM 调速系统设计”。该系统主要由 STM32F103C8T6 单片机核心板、DS18B20 温度采集、风扇驱动、按键、LCD1602 显示等部分组成。 STM32F103C8T6 单片机核心板作为整个系统的控制中心&#xff0c;发挥着关键的统筹和决策作用。…

作者头像 李华
网站建设 2026/1/30 21:22:09

【收藏必备】智能体系统vs单次调用:LangChain分层架构实战指南与最佳选择

本文详细解析了智能体系统(Agent System)的分层架构及其与单次模型调用的区别。介绍了智能体系统的核心构件(模型、工具、中间件等)和价值所在(可控、可观测、稳定)。通过实例对比&#xff0c;说明了何时应采用Agent编排而非单次模型调用&#xff0c;以及如何实现最小可用系统。…

作者头像 李华