区间的合并

给定 n个区间 [l_{i},r_{i}],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3]和 [2,6]可以合并为一个区间 [1,6]。

输入格式

第一行包含整数 n。

接下来 n行,每行包含两个整数 l和 r。

输出格式

共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围

1≤n≤100000,
-10^{9}l_{i}r_{i}10^{9}

输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3

 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int,int> PII;vector<PII> segs;void merge(vector<PII>& segs){//这里注意引用符号,关于引用的用法我前面有说过,这里就不说了。vector<PII> res;//定义装结果区间的vector数组res。sort(segs.begin(),segs.end());/*在操作之前,先将输入的一个个区间给排序,这里要注意,我们是用的vector<PII> segs;来存的,是pair<int,int>,相当于输入的{l,r}就是一个元素,数组里面有多少个元素,就说明有多少个区间,这一点我会在我写的博客里面细讲的。*/int st = -2e9,ed = -2e9;/*初始化定义开始值和结束值为-2e9,定义为-2e9是因为输入的是l,r两个,这里相当于定义的是无效值的感觉,说明此时还没有开始,区间里面还没有值。*/for(auto seg : segs){if(ed < seg.first){/*我的理解是:这个ed是当前操作区间的末尾点ed,而seg.first则是当前操作区间的下一个枚举区间,当当前操作区间的末尾点ed小于下一个枚举区间的开头seg.first的时候,就说明当前操作区间与下一个枚举区间之间没有交集,既然没有交集,那就将当前操作区间放入结果vector数组res里面。*/if(st != -2e9)  res.push_back({st,ed});//当前操作区间{st,ed}直接插入进去。/*刚开始我们初始化了st=-2e9,满足条件,要将当前操作区间放入结果数组里面的时候,要注意,不能让st等于初始值-2e9,不然会报错。*/st = seg.first,ed = seg.second;//将当前操作区间放入结果数组后,将st和ed两个更新为下一个枚举区间的st,ed的值,准备下一次操作}else ed = max(ed,seg.second);/*如果满足上面的条件,那就说明两个区间之间有交集,那么这个时候st是不动的,只需要将ed更新为两个区间中最大的那个ed值即可,就是求两个集合的并集。*/     }if(st != -2e9)   res.push_back({st,ed});/*注意,当遍历循环次数结束的时候,最后得到的那个区间是没办法加入到结果数组res里面的,所以这里判断,如果st不为初始值的化,那么就把此时的{st,ed}结果区间给插进去,就可以了。而且这个还有一个作用就是防止输入的区间是空的。*/segs = res;/*将得到的结果数组覆盖之前的segs数组,最后方便输出。所以这里可以看出来,res数组只是一个中间变量而已。*/
}int main(){int n;cin>>n;for(int i=0;i<n;i++){int l,r;cin>>l>>r;segs.push_back({l,r});/*定义这个segs(vector)类型的是因为每一次输入的数都不一样,随着输入次数的变化。segs里面的内容也会随着变化,所以这种存变化的数据的就用可变数组vector来存。*/}merge(segs);/*输入之后就想着合并,注意,我们segs刚开始是存储的所有的输入的序列,为了输出和各方面的方便,我们也segs来作为结果输出,那么想做到这样就是在一个函数里面把结果给得到,然后把结果复制给segs,把segs原有的给覆盖,最后就可以输出了,就是下面的cout那句话了。*/cout<<segs.size()<<endl;/*res结果区间复制给segs区间,覆盖他,最后输出里面有几个区间元素就得到了结果了。*/return 0;
}

 注意事项:

1、

这句代码 sort(segs.begin(), segs.end()); 是用来对容器 segs 中的元素进行排序的。具体来说:

   segs 是一个存储区间的容器,比如一个 vector<pair<int, int>>

   sort(segs.begin(), segs.end()); 会对容器 segs 中的所有元素进行排序。

排序的细节

      如果 segs 是 vector<pair<int, int>>,那么 sort 函数会按照 pair 的第一个元素(即每个区间的起始位置 l)进行排序。如果第一个元素相同,则会按照第二个元素(即每个区间的结束位置 r)进行排序。

     这意味着,排序后的 segs 会按照区间的起始位置升序排列,如果起始位置相同,则按照结束位置升序排列。

示例

假设 segs 的内容是:

vector<pair<int, int>> segs = {{3, 5}, {1, 4}, {2, 6}};

经过 sort(segs.begin(), segs.end()); 后,segs 将变成:

{{1, 4}, {2, 6}, {3, 5}}

排序后的结果是按每个区间的起始位置从小到大排列的。如果两个区间的起始位置相同,则按结束位置排序。

相当于说一个区间就是一个元素,因为我们使用的就是pair<int,int>来存的,就是说我们每次输入的{l,r}就是一个元素,千万不要理解为每个数来排序,这样理解是错误的哦。

2、对于ed < seg.first这个判断条件的理解

       操作区间(Current Interval):通常表示你当前正在处理或操作的区间。这可能是一个动态的区间,随着程序的执行而不断变化。

       枚举区间(Enumerated Interval):这是你用来比较的固定区间,通常是从某些数据结构中提取出来的或者是预定义的。

ed < seg.first的含义

ed < seg.first 这一条件表示你正在将操作区间的结束点 ed 与枚举区间的起始点 seg.first 进行比较。这通常用于确定操作区间是否与枚举区间有重叠或者是否有关系。

      如果 ed < seg.first:这表明操作区间的结束点在枚举区间的开始点之前。这可能意味着当前的操作区间在时间上或者逻辑上完全在枚举区间的左侧,没有交集。

      如果操作区间和枚举区间有交集,则会有条件处理或者更新操作区间的逻辑。这是因为交集可能需要合并、分割或其他操作来正确处理数据。

ed 代表当前操作区间的结束点,而 seg.first 代表枚举区间的起始点。这种比较通常用于判断操作区间与枚举区间是否有重叠,进而决定如何处理这些区间的逻辑。

3、总结:

初始化 st 和 ed 为 -2e9 是为了表示当前没有有效的区间。

遍历区间并根据是否重叠或相邻来决定是否将区间添加到结果中。

处理最后一个区间是为了确保最后一个有效区间被包含在结果中。

4、是否可以省略 if (st != -2e9) res.push_back({st, ed});

不能省略。在处理不重叠的区间时,我们需要确保当前的区间被正确地添加到结果中。初始值 -2e9 的作用是标记“无效”状态,所以当 st 不等于 -2e9 时,说明我们已经有一个有效的区间需要被添加到结果中。

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

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

相关文章

解决python-docx设置字体为宋体无效

环境&#xff1a;python3.12 python-docx 1.1.2 最初使用的设置字体的代码&#xff1a; from docx import Documentfrom docx.oxml.ns import qndoc Document()style doc.styles[Title]style.font.name Times New Roman # 设置西文字体style._element.rPr.rFonts.set(qn(w:e…

828华为云征文|Flexus云服务器X实例快速部署在线测评平台,适用各种信息学教学

文章目录 如何选配Flexus云服务器X实例服务器HydroOJHOJ 服务器资源的选取基础配置实例规格镜像、存储、网络弹性公网IP云服务器名称 部署HydroOJ1.设置安全组、开放端口2.部署HydroOJ回到控制中心&#xff0c;远程登录 部署HOJ安装docker# 安装docker-compose部署HOJ 本篇幅为…

Kafka API操作

文章目录 1、 Kafka 基础API1_Topic基本操作 DML管理2_生产者3_消费者 sub/assign4_自定义分区策略5_序列化6_拦截器 2、Kafka API高级特性1_Offset自动控制2_Acks & Retries3_幂等性4_事务控制1、生产者事务Only2、消费者&生产者事务3、测试需要的三个消费者案例属性 …

常用环境部署(二十)——docker部署OpenProject

一、安装Docker及Docker-compose https://blog.csdn.net/wd520521/article/details/112609796 二、docker拉取OpenProject镜像 1、拉取镜像 docker pull openproject/openproject:14 注意&#xff1a; 拉取镜像的时候会有超时的现象出现&#xff0c;大家重新拉取几次就行…

JavaWeb开发中为什么Controller里面的方法是@RequestMapping?

在Java Web开发中&#xff0c;尤其是在使用Spring MVC框架时&#xff0c;RequestMapping注解被广泛应用于Controller层的方法上&#xff0c;这是因为RequestMapping是Spring MVC提供的一个核心注解&#xff0c;用于将HTTP请求映射到相应的处理器类或处理器方法上。通过这种方式…

AWTK HTML View 控件更新

AWTK HTML View 控件基于 Lite HTML 实现&#xff0c;从最初的版本开始&#xff0c;3 年多过去了&#xff0c;Lite HTML 做了大量的更新&#xff0c;最近抽空将 AWTK HTML View 控件适配到最新版本的 Lite HTML&#xff0c;欢迎大家使用。 AWTK HTML View 控件。HTML View 控件…

【数据结构(初阶)】——二叉树

【数据结构】——二叉树 文章目录 【数据结构】——二叉树前言1. 树的概念及结构1.1 树的概念1.2 树的结构 2. 二叉树的概念及结构2.1 二叉树的概念2.2 二叉树的结构2.3 二叉树的性质 3. 二叉树顺序结构及概念3.1 二叉树的顺序结构3.2 堆的概念及结构3.3 堆的实现3.3.1 堆的基本…

OpenAI 的 o1 大模型在数学和编码方面有了几乎 10 倍的能力提升!

你有没有想过,有一天人工智能可以在数学和编程这两个领域里,真正成为人类的“得力助手”,甚至是超越我们?最近,OpenAI 发布的 o1大模型在这方面取得了几乎 10 倍的能力提升。10 倍!你没有看错。这样的进步让人不禁怀疑:AI 真的能做到“秒懂”数学和编程吗?今天,我们就…

远程访问NAS速度慢??那是因为你没用对。。。

虽然局域网&#xff08;内网&#xff09;、公网&#xff08;外网&#xff09;经常被提到&#xff0c;但很多人依旧搞不懂分不清楚。。。 其实&#xff0c;简单的方法就是把局域网IP比喻成公司的内部通讯&#xff0c;公网IP看作公共通讯平台。 这样拥有公网IP能被直接远程访问&…

redis内存清理和linux系统清理缓存以及redis启动

1清空所有数据库 redis-cli FLUSHALL 2清空所有数据库redis-cli FLUSHDB 3. 删除指定的缓存键 redis-cli DEL <key>4. 设置键过期 redis-cli EXPIRE <key> <seconds>例如&#xff1a; redis-cli EXPIRE mykey 605.启动redis 这个启动命令要在/usr/loca…

【Canvas与密铺】90年代马赛克密铺效果 1920x1080

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>20世纪90年代马赛克瓷砖效果1920x1080</title><style type&…

MySQL:bin log

redo log 它是物理日志&#xff0c;记录内容是“在某个数据页上做了什么修改”&#xff0c;属于 InnoDB 存储引擎。 而 binlog 是逻辑日志&#xff0c;记录内容是语句的原始逻辑&#xff0c;类似于“给 ID2 这一行的 c 字段加 1”&#xff0c;属于MySQL Server 层。 不管用什…

如何处理DDOS攻击问题

随着信息技术的飞速发展&#xff0c;网络已成为现代社会不可或缺的一部分&#xff0c;极大地便利了个人社交和商业活动。然而&#xff0c;网络空间在创造无限机遇的同时&#xff0c;也潜藏着诸多威胁&#xff0c;其中分布式拒绝服务攻击&#xff08;DDoS&#xff0c;Distribute…

全球工业经济系统极端降水暴露数据集(2010年、2016-2035年和2046-2065年)

全球工业经济系统极端降水暴露数据集 数据介绍 1. 数据的时间覆盖范围&#xff1a; 数据收集时期为2010年、2016-2035年和2046-2065年。 2. 空间覆盖和投影&#xff1a; 空间覆盖范围&#xff1a;全球 经度&#xff1a;-180 - 180 纬度&#xff1a;-90 - 90 投影&#x…

qemu和libvirt的配置对比

libvirt的很多配置选项其实是调用了qemu的接口&#xff0c;但也有增加和优化的地方&#xff0c;本文主要总结这些配置选项&#xff0c;当个手册来查询。 按照centos停服前最后一版centos-8.5.2111提供的rpm查看http://mirrors.aliyun.com/centos/8.5.2111/AppStream/aarch64/o…

【JUC】16-Java对象内存布局和对象头

1. 对象的内存布局 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以分为三个部分&#xff1a;对象头、实例数据和对齐填充。 对象头&#xff1a;由对象标记和类型指针。

[数据集][目标检测]烟叶病害检测数据集VOC+YOLO格式612张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;612 标注数量(xml文件个数)&#xff1a;612 标注数量(txt文件个数)&#xff1a;612 标注类别…

精心整理|算法备案大模型备案最新数据汇总

根据《互联网信息服务算法推荐管理规定》第二条 在中华人民共和国境内应用算法推荐技术提供互联网信息服务&#xff08;以下简称算法推荐服务&#xff09;&#xff0c;适用本规定。法律、行政法规另有规定的&#xff0c;依照其规定。前款所称应用算法推荐技术&#xff0c;是指利…

Excel数据转置|Excel数据旋转90°

Excel数据转置|Excel数据旋转90 将需要转置的数据复制在旁边空格处点击鼠标右键&#xff0c;选择图中转置按钮&#xff0c;即可完成数据的转置。&#xff01;&#xff01;&#xff01;&#xff01;非常有用啊啊啊&#xff01;&#xff01;&#xff01;

【数据结构-一维差分】力扣1854. 人口最多的年份

给你一个二维整数数组 logs &#xff0c;其中每个 logs[i] [birthi, deathi] 表示第 i 个人的出生和死亡年份。 年份 x 的 人口 定义为这一年期间活着的人的数目。第 i 个人被计入年份 x 的人口需要满足&#xff1a;x 在闭区间 [birthi, deathi - 1] 内。注意&#xff0c;人不…