P1712 [NOI2016] 区间(线段树 + 贪心 + 双指针)

题目描述

在数轴上有 n 个闭区间从 1 至 n 编号,第 i 个闭区间为 [li​,ri​] 。

现在要从中选出 m 个区间,使得这 m 个区间共同包含至少一个位置。换句话说,就是使得存在一个 x ,使得对于每一个被选中的区间 [li​,ri​],都有 li​≤x≤ri​ 。

对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。

区间[li​,ri​] 的长度定义为 (ri​−li​) ,即等于它的右端点的值减去左端点的值。

求所有合法方案中最小的花费。如果不存在合法的方案,输出 −1。

输入格式

第一行包含两个整数,分别代表 n 和 m。

第 2 到第(n+1) 行,每行两个整数表示一个区间,第 (i+1) 行的整数 li​,ri​ 分别代表第 i 个区间的左右端点。

输出格式

输出一行一个整数表示答案。

输入输出样例

输入 #1复制

6 3
3 5
1 2
3 4
2 2
1 5
1 4

输出 #1复制

2

说明/提示

样例1 解释

解析:

从题目中我们可以观察到,选着线段和 顺序无关,我们可以进行排序。

暴力做法就是 :

我们对线段的长度进行从小到大排序;

当遍历到有点满足x == m时 ,当前 j  减去 i ;

时间复杂度为O(n^2); 爆

我们对区间搜索进行,我们可以用线段树记录区间的 x 进行优化,离散化一下 防止无用的点 :

在利用区间 的 查询时,我们要记录其区间 的中的个数。

在利用双指针进行搜索:

i  , j 含义 i 代表:当在i点如果 满足其 m个时,我们i++。

while(t[1].cnt == m && i <= j)
        {
            i++;
            change(1,s[i].l,s[i].r,-1);    
        } 
        ans = min(s[j].len - s[i].len,ans);

这里要注意 i++ 是,当前满足条件的 点 ,下一个点 就不满足了。

因为我们是 线段长度从小到大 遍历。

所以i 和 j越靠近越小。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ls u<<1
#define rs u<<1|1
const int N = 500005;
struct line{int l,r,len;bool operator < (line& b){return len < b.len;}
}s[N];
struct node{int l,r,cnt,lazy;
}t[N*2*4];
void pushup(int u)
{t[u].cnt = max(t[ls].cnt ,t[rs].cnt);
} 
void build(int u,int l,int r)
{t[u].l = l,t[u].r = r;t[u].cnt = 0;if(l == r){return;}	int mid = l + r>>1;build(ls,l,mid);build(rs,mid+1,r);pushup(u);
} 
void downup(int u){if(t[u].lazy){t[ls].lazy += t[u].lazy;t[rs].lazy += t[u].lazy;t[ls].cnt += t[u].lazy;t[rs].cnt += t[u].lazy;t[u].lazy = 0;}
}void change(int u,int l,int r,int v)
{if(t[u].l > r || t[u].r < l){return;}if(t[u].l >= l&& t[u].r <= r){t[u].lazy += v;t[u].cnt += v;return;}downup(u);change(ls,l,r,v);change(rs,l,r,v);pushup(u);//这个没有加 
}int main()
{int n,m;cin >> n >> m;vector<int> v(n*2);int j = 0;for(int i =1;i <= n;i++){cin >> s[i].l >> s[i].r;s[i].len = s[i].r - s[i].l+1;v[j++] = s[i].l;v[j++] = s[i].r;}sort(v.begin(),v.end());int k = unique(v.begin(),v.end()) - v.begin();sort(s+1,s+1+n);for(int i = 1;i <= n;i++){s[i].l = lower_bound(v.begin(),v.begin()+k,s[i].l) - v.begin();s[i].r = lower_bound(v.begin(),v.begin()+k,s[i].r) - v.begin();}build(1,1,k);int ans = 1e9;for(int i = 0,j = 0;j <= n;){while(t[1].cnt < m && j <= n){j++;change(1,s[j].l,s[j].r,1); }if(t[1].cnt < m) break;while(t[1].cnt == m && i <= j){i++;change(1,s[i].l,s[i].r,-1);	} ans = min(s[j].len - s[i].len,ans);}cout <<(ans == 1e9 ? -1 : ans);return 0;
}

时间复杂度:O(n*logn)

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

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

相关文章

关于Ansible模块 ⑥

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 内容在继《关于Ansible的模块 ①》、《关于Ansible的模块 ②》、《关于Ansible的模块 ③》、《关于Ansible的模块 ④》与《关于a…

YOLOv8草莓生长状态(灰叶病缺钙需要肥料)检测系统(python开发,带有训练模型,可以重新训练,并有Pyqt5界面可视化)

本次检测系统&#xff0c;不仅可以检测图片、视频或摄像头当中出现的草莓叶子是否有灰叶病&#xff0c;还可以检测出草莓叶是否缺钙、是否需要施肥等状态。基于最新的YOLO-v8训练的草莓生长状态检测模型和完整的python代码以及草莓的训练数据&#xff0c;下载后即可运行&#x…

C语言——字符函数和字符串函数

Hello&#xff0c;大家好&#xff0c;今天和大家分享C语言中的几个字符函数和字符串函数&#xff0c;记得三连支持一下哦&#xff01; 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数…

积分短信群发平台:精准营销新利器,助力企业高效触达目标用户

在当今数字化营销时代&#xff0c;精准营销已成为企业获取竞争优势的关键手段。积分短信群发平台作为一种高效、精准的营销工具&#xff0c;正逐渐受到越来越多企业的青睐。通过该平台&#xff0c;企业可以针对目标用户进行个性化的积分活动推广&#xff0c;实现精准营销&#…

leetcode328.奇偶链表

1. 题目描述 在线练习 2. 解题思路 这道题&#xff0c;官方给的是中等难度。其实是一道基础题&#xff0c;大家应该都可以写得出来。 题目中给的示例可以清楚的看到&#xff0c;合并前后的奇偶链的各自包含的节点的顺序是不变的&#xff0c;我们基本可以确定使用尾插法来合并…

IDEA2023连接服务器docker并部署ruoyi-cloud-plus项目

文章目录 TCP 方式连接docker1. 服务器docker配置修改查看虚拟机中Docker配置文件位置修改配置文件重启docker服务关闭防火墙 2. idea安装docker插件3. idea连接docker服务 部署ruoyi-cloud-plus项目1. 项目环境说明2. 安装Centos73. 安装docker4. idea配置服务器SSH连接5. ide…

三天做完pandas数据分析50题第一天

三天做完pandas数据分析50题第一天 第1题 将python的list转换为Series第2题 将字典转换为Series第3题 将Series转换成python的list第4题 使用numpy创建series。第5题 如何为Series添加新的元素&#xff1f;第6题 使用字典创建DataFrame第7题 给DataFrame设置索引列第8题 生成一…

个人博客项目笔记_07

写文章 写文章需要 三个接口&#xff1a; 获取所有文章类别 获取所有标签 发布文章 1. 所有文章分类 1.1 接口说明 接口url&#xff1a;/categorys 请求方式&#xff1a;GET 请求参数&#xff1a; 参数名称参数类型说明 返回数据&#xff1a; {"success":…

2024Mathorcup(妈妈杯)数学建模C题python代码+数据教学

2024Mathorcup数学建模挑战赛&#xff08;妈妈杯&#xff09;C题保姆级分析完整思路代码数据教学 C题题目&#xff1a;物流网络分拣中心货量预测及人员排班 因为一些不可抗力&#xff0c;下面仅展示部分代码&#xff08;很少部分部分&#xff09;和部分分析过程&#xff0c;其…

uni-app调用苹果登录,并获取用户信息

效果 模块配置 dev中的配置 需要开启登录的权限&#xff0c;然后重新下载配置文件&#xff0c;发布打包基座&#xff0c;再运行程序 代码 <button click"appleLogin">苹果登录</button>function appleLogin() {uni.login({provider: apple,success: …

备战蓝桥杯---刷杂题2

显然我们直接看前一半&#xff0c;然后我们按照斜行看&#xff0c;我们发现斜行是递增的&#xff0c;而同一行从左向右也是递增的&#xff0c;因此我们可以直接二分&#xff0c;同时我们发现对称轴的数为Ck,2k. 我们从16斜行枚举即可 #include<bits/stdc.h> using name…

git push报错remote: Please remove the file from history and try again

原因&#xff1a;上传文件超过100M&#xff0c;找到此文件删除即可。 1、查看是哪个文件过大&#xff0c;此处对用红框里面的 a6de1336c67c3bac77757c5eff8c8001823f7c92&#xff0c;得到具体的文件名称 git rev-list --objects --all | grep a6de1336c67c3bac77757c5eff8c80…

如果你想在Nomad Web中操作Excel数据

大家好&#xff0c;才是真的好。 没有意外&#xff0c;我猜你也会想在Nomad Web中操作Excel数据&#xff0c;毕竟你在Notes客户机中就是这样操作的。 不过&#xff0c;一个运行在浏览器中&#xff0c;一个运行在Notes客户机&#xff08;操作系统&#xff09;中。因此&#xf…

host文件nginx代理 综合理解

之前一直理解得很糙 导致遇到问题很迷糊 今天经过大佬两句话讲明白了 特此记录 host文件 首先host做了代理 也就是对浏览器的DNS寻址做了拦截 具体原理可以参照当我们在地址栏输入URL的时候浏览器发生了什么 例如127.0.0.1 www.baidu.com 将 127.0.0.1 www.baidu.com 链接自…

骨传导耳机怎么选?盘点五款2024畅销热门机型推荐

作为有着多年工作经验的数码测评师&#xff0c;我最近收到很多粉丝朋友的私信&#xff0c;大部分都是想了解关于骨传导耳机怎样选择之类的问题&#xff0c;我们可以看到&#xff0c;目前市面上的骨传导耳机五花八门&#xff0c;它们的质量和性能都参差不齐&#xff0c;甚至有很…

鸿蒙开发-ArkTS语言-并发-案例

鸿蒙开发-UI-交互事件-键鼠事件 鸿蒙开发-UI-交互事件-焦点事件 鸿蒙开发-UI-交互事件-手势事件 鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 文章目录 前言 一、CPU密集型任务 1. 使用TaskPool进行图像直方图处理 2. 使用w…

【cocos creator】【TS】贝塞尔曲线,地图之间显示曲线,顺着曲线移动

参考&#xff1a; https://blog.csdn.net/Ctrls_/article/details/108731313 https://blog.csdn.net/qq_28299311/article/details/104009804 const { ccclass, property } cc._decorator;ccclass export default class mapPanel extends cc.Component {property(cc.Node)pla…

2024 年 3 月 Web3 游戏报告:市场趋势与投资动态

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;Footprint Analytics GameFi Research 2024 年 3 月&#xff0c;比特币不断刷新纪录&#xff0c;成功跨越了月中的低谷。受益于宏观经济的积极态势&#xff0c;整个加密货币市场表现突出。与此同时&#xff0c…

宠物医院电子处方软件操作教程,兽医处方笺范例经验分享

宠物医院电子处方软件操作教程&#xff0c;兽医处方笺范例经验分享 一、前言 以下软件操作教程以&#xff0c;佳易王宠物店兽医电子处方管理系统软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 软件基本功能&#xff1a;权限管理&#xff…

Vscode设置滚轮进行字体大小的调节

Vscode设置滚轮进行字体大小的调节 正常的话按 ctrl 或者 ctrl - 进行字体的大小调节 1.打开Vscode&#xff0c;找打设置的图标&#xff0c;在点击设置&#xff0c;或者直接使用快捷键&#xff0c;【ctrl ,】 2. 在搜索框搜索Font Ligatures 3.双击进入settings.json ,找到如…