算法学习05:离散化、区间合并

news2025/6/15 4:10:25

算法学习05:离散化、区间合并


文章目录

  • 算法学习05:离散化、区间合并
  • 前言
  • 需要记忆的模版:
  • 一、离散化
    • 1.例题:离散化 + 区间和:
    • 拓展:
  • 二、区间合并(贪心)
    • 1.例题:
  • 总结


前言

在这里插入图片描述

需要记忆的模版:

vector<int> alls;//存储所有待离散化的值 
sort(alls.begin(), alls.end());//将所有值排序 
//去除重复的元素,并且不重复的元素 有序 的排在前面 
alls.erase(unique(alls.begin(), alls.end()), alls.end()); 

//找到有序的排在前面的 坐标 所对应的 索引 
//返回 坐标 所对应的 映射 
int find(int x)
{
	int l = 0, r = alls.size() - 1;
	while(l < r)
	{
		int mid = (l + r) >> 1;
		if(alls[mid] >= x) r = mid;
		else l = mid + 1;
	}
	return r + 1;//索引从0开始,映射后从1开始 
 } 


//区间合并:
void merge(vector<PII> &segs)
{
	vector<PII> res;
	
	//按照 区间左端点 排序 
	sort(segs.begin(), segs.end());
	
	int st = -2e9, ed = -2e9;//
	for(auto seg : segs)
	{
		if(ed < seg.first)
		{
			//一个区间已经合并完了 
			if(st != -2e9) res.push_back({st, ed});
			st = seg.first, ed = seg.second;//更新 
		}
		else ed = max(ed, seg.second());//判断 ed 是否要更新 
	}
	//注意:无论是那种情况到最后,都还剩下一个 区间 没有加入到res中 
	if(st != -2e9) res.push_back({st, ed}); 
	
	segs = res;
}

提示:以下是本篇文章正文内容:

一、离散化

1.例题:离散化 + 区间和:

例题:求区间和,区间长度无限长(无限长的数轴)
具体题目:假定有一个无限长的数轴,数轴上的每个坐标都是0,我们首先进行n次操作,每次操作将某一位置x上的数加c。
接下来进行m次询问,每次询问包含 l 和 r ,求区间[l,r]间所有数的和。

在这里插入图片描述



在这里插入图片描述

int main()
{
	cin >> n >> m;
	//插入n次数操作 --------- 先将数据存储起来 
	for(int i = 0; i < n; i ++)
	{
		int x, c;
		cin >> x >> c;
		add.push_back({x, c});
		
		alls.push_back(x);//存储所有待 离散化 的值 
	}
	//执行m次询问 --------- 先将数据存储起来 
	for(int i = 0; i < m; i ++)
	{
		int l, r;
		cin >> l >> r;
		query.push_back({l, r});
		
		
		alls.push_back(l);//存坐标 
		alls.push_back(r);//存坐标 
	}
	
	//***关键*** 
	sort(alls.begin(), alls.end());//将所有值排序 
	alls.erase(unique(alls.begin(), alls.end()), alls.end()); //去除重复的元素,并且不重复的元素 有序 的排在前面 
	
	//注意:现在我们已经将 坐标 离散化了,而且 输入的数据 也已经存储好了。
	//接下来,我们就要使用 “前缀和” 来求解 “区间和”
	
	//原数组 
	for(auto item : add)
	{
		int x = find(item.first);
		a[x] += item.second;
	}
	
	//前缀和数组 
	for(int i = 1; i <= alls.size(); i ++) s[i] = a[i] + s[i - 1];
	
	//处理询问:
	for(auto item : query)
	{
		int l = find(query.first()), r = find(query.second());
		cout << s[r] - s[l - 1] << endl;
	 } 
	return 0;
 } 


拓展:

在这里插入图片描述

//------ 拓展 ---------
 //注意: vector<int> :: iterator 与  return a.begin() + j;
 //迭代器 与 索引的关系?不清楚。 
 vector<int> :: iterator unique(vector<int> &a)
 {
 	int j = 0;
 	for(int i = 0; i < a.size(); i ++) 
		if(!i && a[i] != a[i - 1]) a[j ++] = a[i];
 	return a.begin() + j;
 }
 



二、区间合并(贪心)

1.例题:

例题:给n个区间,合并有交集的区间,求最后剩下的区间个数。
具体题目:给定n个区间[l i, r i],要求合并所有有交集的区间,(注意:如果在端点出相交,也算有交集),最后输出合并完成后的区间个数。


在这里插入图片描述



在这里插入图片描述



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

using namespace std;

typedef pair<int , int> PII;

const int N = 100000 + 10;

int n;
vector<PII> segs;//存储合并完后的区间

void merge(vector<PII> &segs)
{
	vector<PII> res;
	
	//按照 区间左端点 排序 
	sort(segs.begin(), segs.end());
	
	int st = -2e9, ed = -2e9;//
	for(auto seg : segs)
	{
		if(ed < seg.first)
		{
			if(st != -2e9) res.push_back({st, ed});//一个区间已经合并完了 
			st = seg.first, ed = seg.second;//更新 
		}
		else ed = max(ed, seg.second());//判断 ed 是否要更新 
	}
	//注意:无论是那种情况到最后,都还剩下一个 区间 没有加入到res中 
	if(st != -2e9) res.push_back({st, ed}); 
	
	segs = res;
}

int main()
{
	cin >> n;
	
	for(int i = 0; i < n; i ++)
	{
		int l, r;
		cin >> l >> r;
		segs.push_back({l, r});
	}
	
	merge(segs);
	
	cout << segs.size() << endl;
	return 0;
 } 

总结

提示:这里对文章进行总结:
💕💕💕

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

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

相关文章

【Linux】cpp-httplib库

目录 升级gcc版本 下载cpp-httplib的zip安装包&#xff0c;上传到服务器 ​编辑 简单使用 首先打开gittee,搜索cpp-httplib,选择其中一个即可 也可以点下方链接 cpp-httplib库&#xff1a;cpp-httplib: cpp-httplib (gitee.com) 注意&#xff1a;cpp-httplib在使用的时候需…

300分钟吃透分布式缓存-24讲:Redis崩溃后,如何进行数据恢复的?

Redis 持久化是一个将内存数据转储到磁盘的过程。Redis 目前支持 RDB、AOF&#xff0c;以及混合存储三种模式。 RDB Redis 的 RDB 持久化是以快照的方式将内存数据存储到磁盘。在需要进行 RDB 持久化时&#xff0c;Redis 会将内存中的所有数据以二进制的格式落地&#xff0c;每…

VBA更新xlOLELinks链接的值

xlOLELinks是在Excel文档中插入对象的链接&#xff0c;该链接能够显示被插入文档的数据&#xff0c;通常情况下链接的数值会自动更新&#xff0c;但有时更新也会不及时或失效&#xff0c;这时就需要手动更新&#xff0c;如下图&#xff1a; 以插入Word文档为例&#xff0c;使用…

力扣刷题Days14第二题--80删除数组中重复元素||(js)

目录 1&#xff0c;题目-中等 2&#xff0c;代码 双指针 3&#xff0c;学习与总结 思路学习与整理 1&#xff0c;题目-中等 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组…

这是谁的女儿?其母亲早已红过头了,现在小小年纪的她也爆红网络,没想到吧?

这是谁的女儿&#xff1f;其母亲早已红过头了&#xff0c;现在小小年纪的她也爆红网络&#xff0c;没想到吧&#xff1f; 原来&#xff0c;作母亲的她在红极一时后似乎沉寂了下来&#xff0c;没想到她11岁的女儿近年来也在社交媒体上走红&#xff0c;她为何也成了小网红呢&…

Python实现滚动加权最小二乘法回归模型(RollingWLS算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 滚动加权最小二乘法回归模型&#xff08;Rolling Weighted Least Squares, RollingWLS&#xff09;是一…

vscode 格式化prettier失败出现一大堆错误

如题&#xff0c;使用vscode开发项目时候&#xff0c;会自动进行格式化【安装prettier插件】 但是有时候会出现格式化失败的情况&#xff0c;如果插件安装正确&#xff0c;则可能是代码出现了格式问题。

mysql-视图,创建表,存储过程,循环,判断实操命令

数据库操作命令在IDEA工具database的console命令 数据库表结构与视图 事务隔离级别RR&#xff08;REPEATABLE-READ&#xff09;解决不可重复读演示 mysql-RR隔离级别 -- 查询隔离级别 select transaction_isolation;-- 设置隔离级别 set session transaction isolation level …

常见BUG如何在测试过程中分析定位

前言 在测试的日常工作中&#xff0c;相信经常有测试的小伙伴遇到类似的情况&#xff1a;在项目上线时&#xff0c;只要出现问题&#xff08;bug&#xff09;&#xff0c;就很容易成为“背锅侠”。 软件测试人员在工作中是无法避免的要和开发人员和产品经理打交道的&#xff…

鸿蒙原生应用元服务开发-WebGL网页图形库开发概述

WebGL的全称为Web Graphic Library(网页图形库)&#xff0c;主要用于交互式渲染2D图形和3D图形。目前HarmonyOS中使用的WebGL是基于OpenGL裁剪的OpenGL ES&#xff0c;可以在HTML5的canvas元素对象中使用&#xff0c;无需使用插件&#xff0c;支持跨平台。WebGL程序是由JavaScr…

代码随想录训练营第41天 | 动态规划:01背包理论基础、动态规划:01背包理论基础(滚动数组)、LeetCode 416.分割等和子集

动态规划&#xff1a;01背包理论基础 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;带你学透0-1背包问题&#xff01;_哔哩哔哩_bilibili 动态规划&#xff1a;01背包理论基础&#xff08;滚动数组&#xff09; 文章讲解&#xff1a;代码随想录(…

openJDK17官方镜像报Error loading shared library libfreetype.so

新项目使用openJDK17做的&#xff0c;做完后打包成docker镜像到服务器上运行 docker镜像基础镜像用的是openjdk:17-jdk-alpine 运行后加载验证码的时候报&#xff1a;Error loading shared library libfreetype.so 搜了一圈没找到哪里有共用的带字体库的jdk17镜像&#xff0…

【web | CTF】BUUCTF [强网杯 2019]随便注

天命&#xff1a;这题考点有两个&#xff0c;第一个是闭合&#xff0c;第二个是叠堆注入 先探测一下是不是单引号闭合&#xff0c;其实我一开始以为是没有引号闭合的&#xff0c;毕竟是数字 经过测试&#xff0c;的确是单引号闭合 然后探测未知的东西&#xff0c;我习惯性直接…

Mybaties-Plus saveBatch()、自定义批量插入、多线程批量插入性能测试和对比

一.背景 最近在做一个项目的时候&#xff0c;由于涉及到需要将一个系统的基础数据全量同步到另外一个系统中去&#xff0c;结果一看&#xff0c;基础数据有十几万条&#xff0c;作为小白的我&#xff0c;使用单元测试&#xff0c;写了一段代码&#xff0c;直接采用了MP(Mybati…

Java新特性

本文重点分析Java12到Java17在性能方面和云计算方面取得的进展 Java 7&#xff0c;8&#xff0c;11. 17以及还未发布的Java 21均是LTS&#xff08;Long Term Support&#xff09;版本&#xff0c;Oracle提供5年的维护周期&#xff0c;以及3年的付费额外支持&#xff0c;一共8年…

ULTRAL SCALE FPGA TRANSCEIVER速率

CPLL支持2-6.25速率 QPLL支持速率 实际使用CPLL最高可以超过这个&#xff0c;QPLL最低也可以低于这个&#xff0c;xilinx留的阈量还是比较大。

5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型

5G智能制造纺织工厂数字孪生可视化平台&#xff0c;推进纺织行业数字化转型。纺织工业作为传统制造业的重要组成部分&#xff0c;面临着转型升级的紧迫需求。随着5G技术的快速发展&#xff0c;智能制造成为纺织工业转型升级的重要方向。数字孪生可视化平台作为智能制造的核心技…

Python快速入门系列-2(Python基础语法)

第三章&#xff1a;Python基础语法 3.1 变量与数据类型3.1.1 变量的定义与赋值3.1.2 数据类型3.1.3 类型转换 3.2 注释与缩进3.2.1 注释3.2.2 缩进 3.3 条件语句与循环结构3.3.1 条件语句3.3.2 循环结构 3.4 函数与模块3.4.1 函数3.4.2 参数和返回值3.4.3 模块3.4.4 标准库中的…

基于springboot+vue实现物资仓储物流管理系统项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现物资仓储物流管理系统演示 摘要 随着我国经济及产业化结构的持续升级&#xff0c;越来越多的企业借助信息化及互联网平台实现了技术的创新以及竞争力的提升&#xff0c;在电子经济的影响下仓储物流业务也获得了更多的关注度&#xff0c;利用系统平台实现…

KubeSphere4.0企业版

一、介绍 简要介绍 在 KubeSphere 企业版 v4.0 中&#xff0c;推出了全新的 KubeSphere 架构&#xff1a;KubeSphere LuBan&#xff0c;它构建在 ​​Kubernetes​​ 之上&#xff0c;支持高度可配置和可扩展。KubeSphere LuBan&#xff0c;是一个分布式的云原生可扩展开放架…