每周一算法:区间覆盖

news2025/1/17 8:50:53

问题描述

给定 N N N个闭区间 [ a i , b i ] [a_i,b_i] [ai,bi],以及一个线段区间 [ s , t ] [s,t] [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。

输出最少区间数,如果无法完全覆盖则输出 − 1 -1 1

输入格式

第一行包含两个整数 s s s t t t,表示给定线段区间的两个端点。

第二行包含整数 N N N,表示给定区间数。

接下来 N N N行,每行包含两个整数 a i , b i a_i,b_i ai,bi,表示一个区间的两个端点。

输出格式

输出一个整数,表示所需最少区间数。

如果无解,则输出 − 1 -1 1

数据范围

1 ≤ N ≤ 1 0 5 1≤N≤10^5 1N105 − 1 0 9 ≤ a i ≤ b i ≤ 1 0 9 -10^9≤a_i≤b_i≤10^9 109aibi109

− 1 0 9 ≤ s ≤ t ≤ 1 0 9 -10^9≤s≤t≤10^9 109st109

输入样例

1 5
3
-1 3
2 4
3 5

输出样例

2

算法思想

从测试样例分析,要覆盖线段区间 [ 1 , 5 ] [1,5] [1,5],只需要 2 2 2个闭区间 [ − 1 , 3 ] [-1,3] [1,3] [ 3 , 5 ] [3,5] [3,5],如下图所示。

在这里插入图片描述
可以采用贪心的思想来解决这个问题:

  • 首先将 N N N个闭区间 [ a i , b i ] [a_i,b_i] [ai,bi]按左端点排序
  • 从前向后遍历每个区间
    • 在所有能覆盖线段区间 [ s , t ] [s,t] [s,t]左端点 s s s的区间中,选择右端点最大的区间 [ a j , b j ] [a_j,b_j] [aj,bj],其中 a j ≤ s a_j\le s ajs,表示能够覆盖点 s s s
    • 然后将 s s s更新成所有满足条件的区间中右端点的最大值
    • 重复上述过程,直到 s ≥ t s\ge t st,表示线段区间被完全覆盖

时间复杂度

  • n n n个区间排序的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
  • 从前向后遍历每个区间,由于每个区间仅会处理 1 1 1次,因此时间复杂度为 O ( n ) O(n) O(n)

总的时间复杂度为 O ( n + n l o g n ) O(n + nlogn) O(n+nlogn)

代码实现

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
typedef pair<int, int> PII;
PII st[N];
int main()
{
    int s, t, n, ans = 0, flag = 0;
    cin >> s >> t >> n;
    for(int i = 0; i < n; i ++) cin >> st[i].first >> st[i].second;
    //排序
    sort(st, st + n);
    for(int i = 0; i < n; i ++)
    {
    	//在所有能覆盖线段左端点s的区间中,选择右端点最大的区间
        int j = i, R = -1e9;
        while(j < n && st[j].first <= s) R = max(R, st[j ++].second);
        
        //无法覆盖左端点s
        if(R < s) break;
        
        ans ++; //需要的区间个数增加1
        
        s = R; //更新要覆盖的左端点
        if(s >= t) //覆盖完成
        {
            flag = 1;
            break;
        }
        
        i = j - 1; //继续从当前区间向后遍历
    }
    if(flag) cout << ans;
    else cout << -1;
    return 0;
}

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

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

相关文章

程序员如何高效学习技术?

我们相信努力学习一定会有收获&#xff0c;但是方法不当&#xff0c;既让人身心疲惫&#xff0c;也没有切实的回报。 不少朋友每天都阅读技术文章&#xff0c;但是第二天就忘干净了。工作中领导和同事都认可你的沟通和技术能力&#xff0c;但是跳槽面试却屡屡碰壁。面试官问技术…

javaWebssh民宿管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh民宿管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模 式开发。开发环境为TOMCAT7.0,My…

Graph Transformer2023最新研究成果汇总,附15篇必看论文

图Transformer是一种结合了Transformer模型和图神经网络&#xff08;GNN&#xff09;的框架&#xff0c;用于在图形结构数据上执行预测任务。在图Transformer中&#xff0c;Transformer的自注意力机制被用来学习节点之间的关系&#xff0c;而GNN则被用来生成节点的嵌入表示。通…

百模大战中的AI行业新趋势:开启技术变革的大门

引言 在百模大战中&#xff0c;AI行业的发展正在经历前所未有的变革。这场竞争不仅推动了AI技术的快速发展&#xff0c;也揭示了AI行业的新趋势。本文将深入探讨这些方向&#xff0c;为读者提供对AI行业未来发展的深刻洞察。 一、技术进步 百模大战的激烈竞争推动了AI技术的飞…

VR全景图片制作时有哪些技巧,VR全景图片能带来哪些好处

引言&#xff1a; VR全景图片是通过虚拟现实技术制作出的具有沉浸感的图片&#xff0c;能够提供给用户一种身临其境的感觉。在宣传方面&#xff0c;它有着独特的优势和潜力&#xff0c;能够帮助吸引更多的潜在客户&#xff0c;那么VR全景图片制作时有哪些技巧&#xff0c;VR全…

uni-app uni.scss内置全局样式变量

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

【快速全面掌握 WAMPServer】04.人生初体验

网管小贾 / sysadm.cc 我们在前面的教程中为小伙伴们详细地介绍了 WampServer 的安装方法&#xff0c;相信大家对于如何安装应该已经有了一个比较完全的掌握。 在完全掌握安装方法之后&#xff0c;我们还可以更加便捷地使用我为大家提供的一键安装批处理程序来快速搞定安装部署…

Qt Creator可视化交互界面exe快速入门4

上一期介绍了信号与槽&#xff0c;本期介绍加法计算器 我们来新建一个项目 然后拖动设置按钮 还需要个输出框 这里拖动Line Edit 我这里只是简单演示一下&#xff0c;做个低配版计算器&#xff0c;再加个加号和一个等于号就结束了。 然后回到代码编辑部分&#xff0c;我们需要…

关于SQL时间盲注(基于sleep函数)的手动测试、burpsuite爆破、sqlmap全自动化注入

SQL时间注入是一种常见的SQL注入攻击方式&#xff0c;攻击者通过在SQL语句中注入时间相关的代码&#xff0c;来获取敏感信息或者执行非法操作。其基本原理如下&#xff1a; 攻击者向Web应用程序中输入一段恶意代码&#xff0c;通过SQL语句查询数据库&#xff0c;并注入时间相关…

postman使用-03发送请求

文章目录 请求1.新建请求2.选择请求方式3.填写请求URL4.填写请求参数get请求参数在params中填写&#xff08;填完后在url中会自动显示&#xff09;post请求参数在body中填写&#xff0c;根据接口文档请求头里面的content-type选择body中的数据类型post请求参数为json-选择raw-选…

HDFS客户端UnknownHostException事故解析

文章目录 前言事故现场问题分析是否是整个域名解析服务当时都出问题了是否是出问题的pods本身的域名解析有问题 异常发生的全部过程域名的解析是什么时候发生的&#xff0c;怎么发生的域名解析的详细流程 重试发生在什么地方为什么重试会无效 Bugfix代码详解关于StandardHostRe…

3D换肤在服装行业的应用

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 通过采用高质量的 3D 模型&#xff0c;企业可以提供更加身临其境的体…

透彻掌握GIT基础使用

网址 https://learngitbranching.js.org/?localezh_CN 清屏 clear重新开始reset

DevOps(开发运维)常用的工具

"DevOps"是"Development"&#xff08;开发&#xff09;和"Operations"&#xff08;运维&#xff09;两个术语的组合&#xff0c;旨在代表公司应用开发和IT运维团队执行的任务的协作或共享方法。 DevOps描述了采用迭代软件开发、自动化以及可编程…

科荣 AIO ReportServlet 任意文件读取漏洞复现

0x01 产品简介 科荣AIO 企业⼀体化管理解决⽅案 通过ERPERP&#xff08;进销存财务&#xff09;、OAOA&#xff08;办公⾃动化&#xff09;、CRMCRM&#xff08;客⼾关系管理&#xff09;、UDPUDP&#xff08;⾃定义平台&#xff09;&#xff0c;集电⼦商务平台、⽀付平台、ER…

计算机组成原理复习1

概论 文章目录 概论计算机系统计算机硬件系统计算机软件系统 计算机系统的层次结构计算机系统的工作过程冯诺依曼计算机结构冯氏机的特点 现代计算机现代计算机的组成计算机硬件的主要技术指标机器字长存储容量运算速度 计算机的历史与发展 计算机系统 计算机系统硬件软件 计…

安装DataEase(Linux线上安装)修改端口

问题一&#xff1a;端口更改 警告本解决方法仅仅应急&#xff0c;如果找到了更好的方法请通知我&#xff0c;感谢你的理解&#xff01;&#xff01;&#xff01; 为了让mysql与dataease的端口不发生冲突&#xff0c;将 MySQL 外部运行端口参数 ${DE_MYSQL_PORT} 改为新端口&am…

解决 Nginx 反向代理中的 DNS 解析问题:从挑战到突破20231228

引言 在使用 Nginx 作为反向代理服务器时&#xff0c;我们可能会遇到各种配置和网络问题。最近&#xff0c;我遇到了一个有趣的挑战&#xff1a;Nginx 在反向代理配置中无法解析特定的域名&#xff0c;导致 502 错误。这个问题的解决过程不仅揭示了 Nginx 的一个不太为人知的功…

docker学习(二十、network使用示例host、none)

文章目录 一、host应用示例总结 二、none应用示例总结 network相关内容&#xff1a; docker学习&#xff08;十八、network介绍&#xff09; docker学习&#xff08;十九、network使用示例bridge&#xff09; docker学习&#xff08;二十、network使用示例host、none&#xff0…

Dockerfile - 基于 SpringBoot 项目自定义镜像(项目上线全过程)

目录 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 1.2、打包项目&#xff08;jar&#xff09; 1.3、编写 Dockerfile 文件&#xff0c;构建镜像 1.4、运行镜像并测试 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 a&#xff09;简…