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

区间分组详解

步骤

按照左端点排序原因(个人理解):让每个组的区间都排列的更加紧密,并且如果按照右端点排序,而不知道左端点的位置,可能造成误差

priority_queue<int>表示一个大根堆,队列的顶部存储的是最大的元素。

priority_queue<int, std::vector<int>, std::greater<int>>表示一个小根堆,队列的顶部存储的是最小的元素。

判断是否需要添加一个新组

 if (heap.empty() || heap.top() >= r.l) heap.push(r.r);//堆是空的或者堆顶的值大于该区间的左端点,需要开一个新组else{heap.pop();//删掉堆顶heap.push(r.r);//把当前的新的右端点加入堆}

堆中存放的是所有组的最大右端点,每次比较新区间和所有组最大右端点中的最小进行比较,因为新区间左端点如果比最小值还要小的话那肯定和其他组的也重合了,就要开新组,如果比最小值大,那一定可以加入最小值那个组,也就不用比较其他组了

AC代码

#include <iostream>
#include <algorithm>
#include <queue>using namespace std;const int N = 100010;int n;
struct Range
{int l, r;bool operator< (const Range &W)const{return l < W.l;}
}range[N];int main()
{cin>>n;for (int i = 0; i < n; i ++ ){int l, r;cin>>l>>r;range[i] = {l, r};}sort(range, range + n);priority_queue<int, vector<int>, greater<int>> heap;//小根堆,用来存储所有组的右端点最大值,堆顶存储的是目前所有组中最小的右端点for (int i = 0; i < n; i ++ ){auto r = range[i];if (heap.empty() || heap.top() >= r.l) heap.push(r.r);//堆是空的或者堆顶的值大于该区间的左端点,需要开一个新组else{heap.pop();//删掉堆顶heap.push(r.r);//把当前的新的右端点加入堆}}cout<<heap.size();//堆的大小就是组的个数return 0;
}

相关文章:

  • 83k Star!n8n 让 AI 驱动的工作流自动化触手可及
  • 使用Spark-TTS-0.5B模型,文本合成语音
  • Lua 第7部分 输入输出
  • React.cloneElement的用法详解
  • Flowable 与 bpmn.io@7.0 完整集成示例 Demo
  • 解决IntelliJ IDEA配置文件(application.properties)中文注释变成乱码的问题
  • 明远智睿2351开发板:四核1.4G处理器——开启高效能Linux系统新纪元
  • 耀百岁中医养生与上海隽生中医药研究中心达成战略合作——共筑中医养生科研创新高地
  • 【JavaEE】-- MyBatis操作数据库(1)
  • spring中使用netty-socketio部署到服务器(SSL、nginx转发)
  • STM32F103C8T6 HAL库 U盘模式(MSC)
  • Pycharm(十五)面向对象程序设计基础
  • Linux 内核中 cgroup 子系统 cpuset 是什么?
  • 【专题刷题】滑动窗口(三)
  • 【系统架构设计师】嵌入式微处理器
  • 2025-04-22| Docker: --privileged参数详解
  • Ansys Zemax | 在 MATLAB 中使用 ZOS-API 的技巧
  • 最美丽的区间
  • Trino分布式 SQL 查询引擎
  • [Java · 铢积寸累] 数据结构 — 数组类型 - 概念引入
  • 国际货币基金组织:将今年美国经济增长预期下调0.9个百分点至1.8%
  • 河南省粮食和物资储备局党组书记吴祖明已任省国资委主任
  • 重返母校:哈佛大学医学院博士后陈则宇入职北大基础医学院
  • KZ队史首冠,透过春决看CF电竞张扬的生命力
  • 国务院国资委:推动央企强化资金统筹,确保及时付款
  • 我国与沙特签署《核能发展安全与安保合作谅解备忘录》