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

news2024/11/15 18:15:03

题目描述

在数轴上有 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.coloradmin.cn/o/1596285.html

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

相关文章

传奇引擎M2小火炬HGE绘图完整

传奇小火炉HGE绘图完整 参考资料;传奇小火炉HGE绘图完整_98999NET源码资源网

怎样用现货黄金行情软件看走势图?

不管大家用哪一款行情软件来看盘&#xff0c;都离不开K线这种记录市场走势语言。它的中文名称是蜡烛图&#xff0c;由金价每个分析周期的开盘价、最高价、最低价和收盘价绘制而成。以绘制日K线为例&#xff0c;投资者首先要确定开盘和收盘的价格&#xff0c;把它们之间的部分画…

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

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

【详细介绍下火绒安全】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

2011年认证杯SPSSPRO杯数学建模B题(第二阶段)生物多样性的评估全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 B题 生物多样性的评估 原题再现&#xff1a; 2010 年是联合国大会确定的国际生物多样性年。保护地球上的生物多样性已经越来越被人类社会所关注&#xff0c;相关的大规模科研和考察计划也层出不穷。为了更好地建立国际交流与专家间的合作&…

pyinstaller工具打包python项目详细教程

使用 Pyinstaller工具 编译打包 Python 项目生成 exe 可执行文件 1.pyinstaller介绍&#xff1a; 介绍&#xff1a;PyInstaller 是一个将 Python 程序转换为独立可执行文件的工具。它能够在 Windows、Linux、Mac OS X、AIX 和 Solaris 等多种系统上运行。详细介绍可参考pyins…

CCF区块链论文录用资讯--ICDE 2024

ICDE是CCF A类会议 (数据库&#xff0f;数据挖掘&#xff0f;内容检索) 其2024录用了8篇区块链论文 Database technology for Blockchains I Efficient Partial Order Based Transaction Processing for Permissioned Blockchains &#xff08;针对许可区块链的高效的基于偏序…

动态规划|63.不同路径II

力扣题目链接 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m obstacleGrid.size();int n obstacleGrid[0].size();if (obstacleGrid[m - 1][n -1] 1 || obstacleGrid[0][0] 1) return 0;vector<ve…

永久关闭 Windows 11 系统更新

永久关闭 Windows 11 系统更新 请注意&#xff0c;关闭系统更新可能会使您的系统面临安全风险。确保您了解可能的后果&#xff0c;并在必要时考虑重新启用更新。 使用组策略编辑器&#xff08;仅限 Windows 11 Pro 和 Enterprise 版&#xff09; 步骤 1&#xff1a;打开本地…

Android Surface的跨进程绘制,如何绘制xml布局给Surface,全网独一份

工作中遇到了这样一个需求 需求&#xff1a;需要将一个自定义View或者自定义布局通过跨进程方式传递给第二个应用来展示&#xff0c;第一个应用负责布局的渲染&#xff0c;第二个应用不需要关心第一个应用的业务和实现&#xff0c;仅提供SurfaceView占位及展示 方案&#xff…

嵌入式学习day16-22(2024.04.06-13)

文章目录 C语言网络编程socket主机与网络字节序转换inet_addr、inet_aton&#xff08;ip转换&#xff09;inet_ntoa 网络字节序转换为IP字符串端口转换为网络字节序网络字节序转换为端口atoi &#xff08;字符串转换为整数&#xff09; UDP通信流程UDP多进程并发服务器服务端客…

【已测 非网上加密版】全新UI彩虹站长在线工具箱系统源码下载 全开源版本

支持高达72种站长工具、开发工具、娱乐工具等功能。本地调用API、自带免费API接口&#xff0c;是一个多功能性工具程序支持后台管理、上传插件、添加增减删功能。 环境要求 * PHP > 7.3 * MySQL > 5.6 * fileinfo扩展 * 使用Redis缓存需安装Redis扩展 部署 * 下载源代码 …

【嵌入式】交叉编译指南:将开源软件带到嵌入式世界

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

Java反序列化Commons-Collections-CC1链

环境搭建 JDK8u71以下&#xff0c;这个漏洞已经被修复了&#xff0c;这个JDK的以上版本都修复了漏洞 JDK8u65 下载地址 https://www.oracle.com/cn/java/technologies/javase/javase8-archive-downloads.html这个时候来到 pom.xml 配置Maven依赖下载CommonsCollections3.2.…

20V/1.5A替代LT1963低压差线性稳压器

概述(替代LT1963) PCD3941 是一款低压差稳压器&#xff0c;专为快速瞬态响应而优化。该装置能够提供 1.5A 的输出电流&#xff0c;典型压降为 160mV。工作静态电流为 1mA&#xff0c;关机时降至 1μA以下&#xff0c;同时压差模式下静态电流控制良好。除了快速瞬态响应外&…

【Linux】封装一下简单库 理解文件系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、封装一下简单库 二、理解一下stdin(0)、stdout(1)、stderr(3) 2.1、为什么要有0、1、2呢&#xff1f; 2.2、特点 2.3、如果我想让2也和1重定向到一个文件…

护眼台灯哪个牌子好?护眼灯十大品牌推荐,绝对真香!

对于有孩子的家庭&#xff0c;特别是阅读爱好者&#xff0c;晚上阅读时的光线问题至关重要。昏暗环境长时间阅读&#xff0c;会严重伤害孩子的眼睛。因此&#xff0c;选择一款合适的护眼台灯显得尤为重要。但市场上品牌众多&#xff0c;护眼台灯哪个牌子好?这往往让人难以抉择…

【Tomcat 文件读取/文件包含(CVE-2020-1938)漏洞复现】

文章目录 前言 一、漏洞名称 二、漏洞描述 三、受影响端口 四、受影响版本 五、漏洞验证 六、修复建议 前言 近日在做漏扫时发现提示服务器存在CVE-2020-1938漏洞&#xff0c;故文章记录一下相关内容。 一、漏洞名称 Tomcat 文件读取/文件包含漏洞(CVE-2020-1938) 二、漏洞描…

a == 1 a== 2 a== 3 返回 true ?

1. 前言 下面这道题是 阿里、百度、腾讯 三个大厂都出过的面试题&#xff0c;一个前端同事跳槽面试也被问了这道题 // &#xff1f; 位置应该怎么写&#xff0c;才能输出 trueconst a ?console.log(a 1 && a 2 && a 3) 看了大厂的面试题会对面试官的精神…

这款开发工具大大降低IoT开发门槛!完全开源,上手超简单

对开发者来说&#xff0c;IoT 开发的难点是什么&#xff1f;首先&#xff0c;IoT 涉及到多个领域和多种开发技术&#xff0c;每一层的技术接口、协议都需要跨平台、跨领域、跨系统的合作协同&#xff1b;在互联互通方面&#xff0c;智能设备间的兼容性亟待进一步地打通融合&…