热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ACDream(18)DisappearingBlocks:离散化与二分查找

题目链接:请点击这里。本题将图形视为波动,其中波峰被淹没时部分数减少,而波谷被淹没时部分数增加。因此,需要预先处理所有波峰和波谷的位置。特别地,图形的两端点需要特殊处理,可以通过设置边界条件来简化问题。
### 题目链接
- [点击访问](#)

### 背景描述
在解决ACDream (18) Disappearing Blocks的问题时,我们将给定的图形视作一系列波动。具体来说,当波峰被水淹没时,图形的部分数量会减少;相反,当波谷被水淹没时,部分数量会增加。基于这一特性,解题的关键在于准确识别并处理所有的波峰和波谷。

### 解题思路
为了有效地处理波峰和波谷,我们首先对图形的两端点进行特殊处理,通常通过将`h[0]`和`h[n+1]`设定为-1来实现。接下来,提取所有波峰和波谷的高度,并按高度降序排列这些点。在遍历这些点时,需要注意的是,对于具有相同高度但非连续的点,应将它们作为一个整体进行处理,确保每次高度变化时的计算结果是正确的。

### 实现细节
1. **数据预处理**:初始化边界条件,并读取输入数据。
2. **波峰波谷识别**:遍历数组,确定每个波峰和波谷的位置。
3. **排序与处理**:将波峰波谷按高度降序排序,并依次处理,确保正确计算每种情况下的部分数量。
4. **二分查找**:使用二分查找算法快速定位特定高度对应的答案。

### 代码示例
```cpp
#include
#include
#define MAX 1000000+10
using namespace std;

int h[MAX];
int Q[MAX];
int res[MAX];
struct Node {
int height;
bool isPeak;
};

bool compare(Node a, Node b) {
return a.height > b.height;
}

int binarySearch(Node a[], int len, int target) {
int left = 0, right = len - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (a[mid].height == target) return mid;
else if (a[mid].height else left = mid + 1;
}
return right;
}

int main() {
int T;
cin >> T;
for (int cas = 1; cas <= T; ++cas) {
int n, m;
cin >> n >> m;
h[0] = h[n + 1] = -1;
for (int i = 1; i <= n; ++i) cin >> h[i];

vector peaksAndValleys;
for (int i = 1; i <= n; ++i) {
if ((h[i] > h[i - 1] && h[i] > h[i + 1]) || (h[i] peaksAndValleys.push_back({h[i], h[i] > h[i - 1]});
}
}

sort(peaksAndValleys.begin(), peaksAndValleys.end(), compare);
int currentParts = 1;
for (const auto& point : peaksAndValleys) {
if (point.isPeak) --currentParts;
else ++currentParts;
res[point.height] = currentParts;
}

cout <<"Case #" < for (int i = 0; i int query;
cin >> query;
int index = binarySearch(peaksAndValleys.data(), peaksAndValleys.size(), query);
cout <<(index >= 0 ? res[peaksAndValleys[index].height] : 0) <<' ';
}
cout < }
return 0;
}
```
### 结论
通过上述方法,我们可以高效地解决Disappearing Blocks问题,利用离散化和二分查找技术,确保了算法的效率和准确性。
推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文深入探讨了二叉搜索树(Binary Search Tree, BST)及其操作,包括查找、插入和删除节点。同时,文章还介绍了平衡二叉树(AVL树)的概念及调整方法,并详细讨论了如何判断两个序列是否构成相同的二叉搜索树。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
author-avatar
C3calm_daidai_649
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有