当前位置: 首页 > news >正文

二维立柱图|积水类问题

1

三类问题

  • 求总的积水量
  • 求水坑的个数
  • 求水坑最深的深度
基本思路

我们需要从列的角度来看第 i i i 列是不是有积水,但我们该如何确定第 i i i 列是否是有积水?

方法是事先维护一个前后缀的最大值, L [ i ] L[i] L[i] R [ i ] R[i] R[i] 分别表示 [ 1 , i ] [1,i] [1,i] [ i , n ] [i,n] [i,n] 中障碍物的最高高度,那么对于第 i i i 列,如果满足 L [ i ] > h [ i ] & & h [ i ] < R [ i ] L[i]> h[i] ~\&\&~ h[i]< R[i] L[i]>h[i] && h[i]<R[i],那么就证明它是低洼地,且水深就是 m i n ( L [ i ] , R [ i ] ) − h [ i ] min(L[i],R[i])-h[i] min(L[i],R[i])h[i]

准备工作
int h[N], L[N], R[N], n;
//分别记录第i列的障碍物高度以及前后缀最大值
void work() {cin >> n;for (int i = 1; i <= n; i++) cin >> h[i];for (int i = 1; i <= n; i++) L[i] = max(L[i - 1], h[i]);for (int i = n; i >= 1; i--) R[i] = max(R[i + 1], h[i]);
}
求总的积水量
int get_sum() {int sum = 0;for (int i = 1; i <= n; i++) {if (L[i] > h[i] && h[i] < R[i]) {sum += min(L[i], R[i]) - h[i];}}return sum;
}
求水坑的个数

注意:即使两个相邻的水坑有相同高度的水平面,只要之间有障碍物相隔,就算是两个水坑。

解决办法:引入一个标记状态的数组 s t [ N ] st[N] st[N],表示第 i i i 列是否是水坑的一条,如果 s t [ i ] = = t r u e & & s t [ i − 1 ] = = t r u e st[i]==true~\&\&~st[i-1]==true st[i]==true && st[i1]==true,那么就说明了他们是属于同一水坑,否则第 i i i 列就属于一个新的水坑。

bool st[N];//表示第i列是否是水坑的一条
int get_cnt() {int cnt = 0;for (int i = 1; i <= n; i++) {if (L[i] > h[i] && h[i] < R[i]) {if (!st[i - 1]) cnt++;st[i] = true;}}return cnt;
}
求水坑的最深的深度
int get_mx() {int mx = 0;for (int i = 1; i <= n; i++) {if (L[i] > h[i] && h[i] < R[i]) {mx = max(mx, min(L[i], R[i]) - h[i]);}}return mx;
}
例题
  • 积水量 http://bailian.openjudge.cn/practice/4074/

  • 有多少坑

题目描述

大雨过后,一些高低不平的地方就会形成积水,俗称为“坑”。

这里我们将问题简化为只考虑一段路面的横截面。我们将这一段截面上的土地分割成单位宽度的窄条,测量出每个窄条的高度。

假设有无穷多的水量从天而降,请你计算一下,这段路面上会形成多少个水坑?坑的最大深度是多少毫米?

输入

输入第一行给出一个正整数 N ( ≤ 100000 ) N(\leq 100000) N(100000)。随后一行给出 N N N 个非负整数,为路面横截面总左到右的单位宽度窄条的高度,以毫米为单位,不超过 1000 1000 1000

输出

输出分两行,第一行输出水坑的个数,第二行输出所有水坑中最大的深度,以毫米为单位。

注意:即使两个相邻的水坑有相同高度的水平面,只要之间有窄条相隔,就算是两个水坑。

样例输入

12
1 4 2 10 7 1 2 1 8 3 1 2

样例输出

3
7

代码实现

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int h[N], L[N], R[N], n;
//分别记录第i列的障碍物高度以及前后缀最大值
bool st[N];//表示第i列是否是水坑的一条
void work() {cin >> n;for (int i = 1; i <= n; i++) cin >> h[i];R[n + 1] = 0;for (int i = 1; i <= n; i++) L[i] = max(L[i - 1], h[i]);for (int i = n; i >= 1; i--) R[i] = max(R[i + 1], h[i]);
}
int get_cnt() {int cnt = 0;for (int i = 1; i <= n; i++) {if (L[i] > h[i] && h[i] < R[i]) {if (!st[i - 1]) cnt++;st[i] = true;}}return cnt;
}
int get_mx() {int mx = 0;for (int i = 1; i <= n; i++) {if (L[i] > h[i] && h[i] < R[i]) {mx = max(mx, min(L[i], R[i]) - h[i]);}}return mx;
}
int main() {work();cout << get_cnt() << "\n" << get_mx();return 0;
}
http://www.lryc.cn/news/501319.html

相关文章:

  • vue前端实现导出页面为word(两种方法)
  • 22. Three.js案例-创建旋转的圆环面
  • Elasticsearch:使用阿里 infererence API 及 semantic text 进行向量搜索
  • Linux WEB服务器的部署及优化
  • 人工智能大模型LLM开源资源汇总(持续更新)
  • 目标跟踪算法:SORT、卡尔曼滤波、匈牙利算法
  • Java版-图论-拓扑排序与有向无环图
  • GTC2024 回顾 | 优阅达携手 HubSpot 亮相上海,赋能企业数字营销与全球业务增长
  • eclipse启动的时候,之前一切很正常,但突然报Reason: Failed to determine a suitable driver class的解决
  • _tkinter.TclError: can‘t find package tkdnd Unable to load tkdnd library.解决办法
  • VBA高级应用30例应用在Excel中的ListObject对象:向表中添加注释
  • folly库Conv类型转换源码解析
  • UE4 骨骼网格体合并及规范
  • Java版企业电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
  • 通过源码⼀步⼀步分析 ArrayList 扩容机制
  • 源码分析之Openlayers中默认Controls控件渲染原理
  • 中间件的分类与实践:从消息到缓存
  • 京东e卡 h5st 4.96
  • 《CSS 知识点》滚动条仅在 hover 时才显示(宽度不改变)
  • 手里有病理切片+单细胞测序的数据,如何开展医工交叉的研究?
  • 力矩扭矩传感器介绍
  • 【Appium】AttributeError: ‘NoneType‘ object has no attribute ‘to_capabilities‘
  • QT 中 多线程(备查)
  • 第八十六条:在实现serializable接口时要特别谨慎
  • 【Elasticsearch 中间件】Elasticsearch 客户端使用案例
  • 深入理解MySQL中的ONLY_FULL_GROUP_BY
  • 获得日志记录之外的新视角:应用程序性能监控简介(APM)
  • 如何避免缓存击穿?超融合常驻缓存和多存储池方案对比
  • 口语笔记——祈使句用法
  • SQL连续登录问题(详细案例分析)