Acwing 区间合并

news2024/11/18 1:47:57

区间合并

主要思想:给定很多区间。若两个区间有交集,将二者合并成一个区间。
具体做法:

  • 先按照区间的左端点进行排序
  • 然后遍历每个区间,根据不同的情况进行合并,有一下几种情况:
    示意图区间
  • 第一种情况,区间不变;
  • 第二种情况,end更新为区间i的右端点;
  • 以上两种情况,可以归结为end更新为max(end,r);r为区间右端点
  • 第三种情况,将当前维护的区间加入结果,并将维护的区间更新为区间i;

下面给出区间合并的板子:

//区间合并
void merge(vector<PII> &segs){
    vector<PII> res;
    
    sort(segs.begin(),segs.end());//对pair先按左端点进行排序,再按右端点排序
    
    int st = -2e9,ed = -2e9; //负无穷
    for(auto seg : segs){
        if(ed < seg.first){//当前维护区间与下一区间无交集
           if(st != -2e9) res.push_back(seg);
           st = seg.first,ed = seg.second;//后移,更新维护区间
        }
        else ed = max(ed, seg.second);//有交集,取两个区间的右端点最大值
    }
    if(st != -2e9) res.push_back({st,ed});//判断,然后将剩下的区间加入
    segs = res;
}

下面来看具体的题目:

给定 n个区间 [ l r , r i ] [l_r,r_i] [lr,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。
例如:[1,3]和 [2,6]可以合并为一个区间 [1,6]。

输入格式:

第一行包含整数 n n n,接下来 n n n 行,每行包含两个整数 l l l r r r

输出格式:

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

输入样例:

5
1 2
2 4
5 6
7 8
7 9

输出样例:

3

本题思路:

  • 读入区间端点 ( l , r ) , (l,r), (l,r),将其存入segs数组内,再设置一个结果数组res数组。这两个数组类型的vector类型,不过是键值对形式的;
  • 将segs排序,设置左右端点 ( s t , e d ) (st,ed) (st,ed)为第一个维护的区间,初始都为无穷大;
  • 遍历segs种的元素(区间),比较当前区间(维护区间)的ed和另一个区间seg的 l l l之间的关系;若 e d < l ed < l ed<l,说明这两个区间没有交集,则直接将此seg区间(注意不能是初始区间)加入到res中,并将待维护的区间变为seg(即更新区间,后移);若 e d < l ed < l ed<l不成立,有交集,则更新 e d ed ed为最大值(这里因为区间排好序,所以不用将st更新为最小)
  • 最后判断segs是否为空,若不为空,则将最后剩余一个维护的区间加入res中;

实现代码:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

typedef pair<int,int> PII;
vector<PII> segs;
int n;

void merge(vector<PII> &segs){
    vector<PII> res;
    
    sort(segs.begin(),segs.end());//对pair先按左端点进行排序
    
    int st = -2e9,ed = -2e9; //负无穷
    for(auto seg : segs){
        if(ed < seg.first){//当前维护区间与下一区间无交集
           if(st != -2e9) res.push_back(seg);
           st = seg.first,ed = seg.second;//后移,更新维护区间
        }
        else ed = max(ed, seg.second);//有交集,取两个区间的右端点最大值
    }
    if(st != -2e9) res.push_back({st,ed});//判断,然后将剩下的区间加入
    segs = res;
}


int main(){
    cin >> n;
    while(n--){
        int l,r;
        cin >> l >> r;
        segs.push_back({l,r});
    }
    merge(segs);
    cout << segs.size() << endl;
    
    return 0;
}

以上就是区间合并的一些内容,后续如果有相关的习题再进行补充更新~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware中安装win7和kail等虚拟机

主要内容 第一部分&#xff1a;安装win 7第二部分 安装kali第三部分 安装UbuntuUbuntu22.04上安装PwntoolsUbuntu上安装vim 第一部分&#xff1a;安装win 7 1.打开安装好的虚拟机 参考链接&#xff1a;虚拟机VMware安装windows7 64位操作系统&#xff08;图文版详解版&…

TDengine 与飞腾腾锐 D2000 完成兼容互认证,推动国产软硬件深度融合

在国家信息安全和自主可控技术日益受到重视的背景下&#xff0c;国产软硬件的发展已成为推动数字经济的重要力量。随着全球科技竞争加剧&#xff0c;企业在选择技术解决方案时&#xff0c;越来越倾向于采用国产产品以降低对外部技术的依赖。这一趋势不仅是为了确保数据安全与隐…

VUE下拉选择分页,远程搜索

实现效果 实现思路 初始化加载第一页&#xff1b;监听下拉框的滚动事件&#xff0c;当滚动到底部的时候加载下一页&#xff1b;输入搜索时&#xff0c;重置为第一页加载&#xff1b;关闭下拉选择框时&#xff0c;判断如果存在搜索值&#xff0c;要清空搜索值、并加载第一页。 …

【运维方案】某系统运维需求方案参考(doc全原件2024)

系统运维需求方案 1服务目标 2服务人力需求、服务资源需求 3信息资产统计服务需求 4业务应用软件服务需求 5网络、安全系统运维服务需求 6主机、存储系统运维服务需求 7数据库系统运维服务需求 8终端运维服务需求 9综合布线系统服务需求 10大屏幕显示系统的维护需求 11视频会议…

2024年最新会声会影2025旗舰版新功能介绍及安装图文激活教程

会声会影2025是一款超级受欢迎的视频播放软件&#xff0c;用于剪辑和编辑各种类型的视频素材。软件具有直观的用户界面&#xff0c;使得即使对于初学者来说也能轻松上手。该软件提供了各种创意工具&#xff0c;可以帮助用户实现他们的创意想法。用户可以裁剪、合并和重新排列视…

SpringBootAdmin源码修改编译002_踩坑记录一堆坑_记录过程_没有成功---VUE工作笔记0027

当前版本是18.19.0 我本地安装的node npm install 执行的时候报错了.上面的错误 说node-ipc@9.2.2的版本 需要使用node 8 10 12 14 16 17的版本,而我安装的是 18.19.0的版本. 这个时候的解决方案是提升node-ipc组件的版本. 可以看到在npmjs网站上找到,对应的组件node-ipc 可…

Hazel 2024

不喜欢游戏的人也可以做引擎&#xff0c;比如 cherno 引擎的作用主要是有两点&#xff1a; 将数据可视化交互 当然有些引擎的功能也包含有制作数据文件&#xff0c;称之为资产 assets 不做窗口类的应用栈&#xff0c;可能要花一年才能做一个能实际使用的应用&#xff0c;只需…

Axure RP 11 Beta 测试版 发布了,目前是免费试用阶段

Axure RP 11 Beta 已经发布上线了&#xff01;各位产品同学可以从下面的链接下载测试版&#xff0c;体验新功能。目前RP11处于免费试用阶段&#xff0c;没有授权的用户也可以免费使用试用版。 与 Axure RP 的以往版本一样&#xff0c;在 RP11 中保存文件后&#xff0c;无法在低…

redis有序集合写入和求交集的速度

背景 团队小伙伴做了一个需求。大概的需求是有很多的图片作品&#xff0c;图片作品有一些类别&#xff0c;每个人进入到每个类别的作品业&#xff0c;根据权重优先查看权重最高的的作品&#xff0c;权重大概是基于每个人对该作品的浏览计算&#xff0c;浏览过的作品放在最后展…

IDEA 通义灵码 插件使用体验

目录 前言 主要功能 演示代码 解释代码 生成单元测试 生成代码注释 生成优化建议 代码片段补全 总结 前言 自从 AI 技术开始大规模应用&#xff0c;老板就想让下面的牛马借助 AI 工具来提高编码效率&#xff0c;由于团队都没有在实际编码中深度使用过 AI 工具&#x…

消息中间件有哪些常见类型

消息中间件根据其设计理念和用途&#xff0c;可以大致分为以下几种常见类型&#xff1a; 点对点消息队列&#xff08;Point-to-Point Messaging Queues&#xff09;&#xff1a; 在这种模型中&#xff0c;消息被发送到特定的队列中&#xff0c;消费者从队列中取出并处理消息。队…

【LeetCode每日一题】——LCR 078.合并 K 个升序链表

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 优先队列 二【题目难度】 困难 三【题目编号】 LCR 078.合并 K 个升序链表 …

Linux入门——“Linux基本指令”上

在刚开始学习Linux时&#xff0c;首先需要掌握一些基本指令&#xff0c;以便我们能更好地使用Linux操作系统&#xff0c;以下指令在Ubuntu 22上执行。以下内容不过多介绍选项内容。 1.ls指令 ls指令用来查看当前目录下的文件&#xff0c;显示的信息是很有限的一般只显示文件名&…

二进制部署ETCD单机版

文章目录 一、签发etcd证书二、搭建etcd单机版三、测试ETCD服务 一、签发etcd证书 注意&#xff1a;在操作签发证书操作时一定要检查服务器时间、时区是否一致&#xff0c;会导致证书不可用&#xff01;&#xff01; 1、创建etcd目录 mkdir /etc/etcd/{ssl,data} -p2、安装签…

【vue-media-upload】一个好用的上传图片的组件,注意事项

一、问题 media 的saved 数组中的图片使用的是location 相对路径&#xff0c;但是我的业务需要直接根据图片链接展示图片&#xff0c;而且用的也不是location 相关源代码 <div v-for"(image, index) in savedMedia" :key"index" class"mu-image-…

基于SpringBoot的社区宠物管理与推荐系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 1.课题的基本内容&#xff0c;可能遇到的困难&#xff0c;提出解决问题的方法和措施 2.1课题的基本内容 本课题主要研究基于SpringBoot的社区宠物管理与推荐系统的设计与实现。用户注册登录系统前端后可以可以实现对宠物信息的…

【读书笔记-《30天自制操作系统》-20】Day21

本篇的内容主要是操作系统的保护&#xff0c;涉及到x86 CPU的一些机制&#xff0c;以及操作系统的异常处理。 1. 字符显示API问题解决 首先来解决一下上一篇内容中字符串显示API没有生效的问题。 void hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ec…

为什么H.266未能普及?EasyCVR视频编码技术如何填补市场空白

H.266&#xff0c;也被称为Versatile Video Coding&#xff08;VVC&#xff09;&#xff0c;是近年来由MPEG&#xff08;Moving Picture Experts Group&#xff09;和ITU&#xff08;International Telecommunication Union&#xff09;联合开发并发布的新一代国际视频编码标准…

[每周一更]-(第114期):介绍GitLab不同角色对应的权限

文章目录 GitLab 角色及其权限项目级别角色组级别角色 使用场景示例 工作中一直使用Gitlab搭建了公司内网的代码管理工具&#xff0c;但是不同的用户会分配相应的权限&#xff0c;来管理不同用户及角色的权限信息&#xff0c;我们来介绍下角色的信息&#xff0c;方便我们管理公…

演示:基于WPF的自绘的中国地铁轨道控件

一、目的&#xff1a;演示一个基于WPF的自绘的中国地铁轨道控件 二、效果演示 北京地铁 成都地铁 上海地铁 深圳地铁 南京地铁 长春地铁 哈尔滨地铁 武汉地铁 厦门地铁 香港地铁 三、功能 支持平移、缩放等操作 鼠标悬停显示线路信息和站点信息 按表格显示&#xff0c;按纸张…