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.hqwc.cn/news/620380.html

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

相关文章

DFS专题:力扣岛屿问题(持续更新)

DFS专题&#xff1a;力扣岛屿问题 一、岛屿数量 题目链接: 200.岛屿数量 题目描述 代码思路 使用深度优先搜索&#xff0c;对每一个网格点进行判断&#xff0c;如果为未搜索过的’1’&#xff0c;则使岛屿数加一&#xff0c;并将与其相连的‘1’都进行标记&#xff0c;确保…

企业为什么要做等级保护

一、等级保护是我国关于网络安全的基本政策 《国家信息化领导小组关于加强信息安全保障工作的意见》&#xff08;中办发[2003]27 号&#xff0c;以下简称“27 号文件”&#xff09;明确要求我国信息安全保障工作实行等级保护制度,提出“抓紧建立信息安全等级保护制度&#xff…

区块链开发者大会圆满结束:记Hack.Summit() 2024的合作机构群像

Hack.Summit() 2024 区块链开发者大会于4月9日至10日在香港数码港隆重举行。经过两天的精彩交流与深入探讨&#xff0c;本次大会圆满落下帷幕&#xff0c;不仅汇聚了全球区块链领域的顶尖人才和机构&#xff0c;还展示了最新的技术成果和创新应用&#xff0c;为区块链行业的发展…

Ubuntu 23.10.1 nginx源码安装

注&#xff1a;以下所有命令均在root管理员模式下&#xff0c;若不是&#xff0c;请在所有命令前加sudo 1、安装依赖库 1.1、安装gcc g的依赖库 apt-get install build-essential apt-get install libtool1.2、安装pcre依赖库 apt-get update apt-get install libpcre3 lib…

接口自动化框架设计之参数传递(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在我们设计自动化测试框架的时候&#xff0c;我们会经常将测试数据保存在外部的文件&#xff08…

C#值传递和引用传递,ref和out关键字,装箱和拆箱

C#值传递和引用传递 1.值传递和引用传递 值传递&#xff1a;值传递时&#xff0c;系统首先为被调用方法的形参分配内存空间&#xff0c;并将实参的值按位置一一对应复制给形参&#xff0c;被调用方法中形参得任何改变都不会影响到相应的实参。 引用传递时&#xff1a;系统不是…

Python-GEE遥感云大数据分析、管理与可视化及多领域案例实践应用

随着航空、航天、近地空间遥感平台的持续发展&#xff0c;遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升&#xff0c;呈现出大数据特征。这为相关研究带来了新机遇&#xff0c;但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…

Docker Desktop修改镜像存储路径 Docker Desktop Start ... 卡死

1、CMD执行wsl -l -v --all 2、Clean / Purge data 3、导出wsl子系统镜像: wsl --export docker-desktop D:\docker\wsl\distro\docker-desktop.tar wsl --export docker-desktop-data D:\docker\wsl\data\docker-desktop-data.tar4、删除现有的wsl子系统&#xff1a; wsl -…

江新安教授受邀金佰利进行《研发创新与创新思维》培训

近日&#xff0c;科济管线创始人江新安教授受邀金佰利为金佰利全国研发团队进行《研发创新与创新思维》培训授课。创新思维的两种思维形式——非逻辑思维和逻辑思维及其训练的主要方法。创新思维的培养&#xff0c;对于克服思维定势&#xff0c;提供创新方法&#xff0c;可以发…

阿斯达年代记三强争霸开服时间+官网地址+预约下载安装教程分享

阿斯达年代记国际服&#xff0c;游戏分为三个势力&#xff0c;分别是阿斯达、亚高和不罚者&#xff0c;每个玩家都必须选择一个势力&#xff0c;而每个势力每周将会诞生一名势力族长&#xff0c;将会从五名候选人中投票产生&#xff0c;想要进入候选人名单&#xff0c;必须每天…

突破编程_前端_SVG(ellipse 椭圆形)

1 ellipse 元素的基本属性和用法 ellipse 元素用于创建椭圆形状。它具有一系列的基本属性&#xff0c;允许自定义椭圆的外观和位置。以下是一些 ellipse 元素的基本属性和用法&#xff1a; &#xff08;1&#xff09;基本属性 cx 和 cy&#xff1a;这两个属性定义了椭圆中心…

HCIP-Datacom H12-831 题库补充(4/12)

2024年 HCIP-Datacom&#xff08;H12-831&#xff09;最新题库&#xff0c;完整题库请扫描上方二维码&#xff0c;持续更新。 以下关于OSPF Sham Link的描述&#xff0c;错误的是哪一项&#xff1f; A&#xff1a;为了使VPN流量通过MPLS VPN骨干网转发&#xff0c;Sham Link的路…