《洛谷深入浅出进阶篇》 P1496火烧赤壁——初识离散化

上链接:

P1496 火烧赤壁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1496上题干:

有一组序列,[-2^31,2^31] , 现在给你n次操作,每一次操作给出两个整数l,r,代表一个子区间的左端点和右端点,[l,r)这就算覆盖一次。求所有的被覆盖的区间的长度

 例如:现在有一个序列:

给你三对数字,代表着区间的左端点和右端点,你分别对这些区间进行染色:

[1,3) 

[ 2,6)

[4,8) 

可以求出,经过这三次操作,被覆盖的区间的长度:

由于数据很小,所以我们可以用数组标记法:

枚举每次给出的区间,我们将区间内的数字打上标记,然后计算所有被打上标记的数有多少个就行了。

可以求出一共7个格子被覆盖了。

那么假如我给出以下的数据,数组标记法还能用吗?

[-2^31,-2^16)

[-65462131,-16846952)

[0,465)

[241,1321464)

[32137946,2^31)

首先,我们可以看出来,数组标记法,一定是行不通的。

首先数组下标是不能为负数,另外,数据达到了2^31,远远超出了数组能开辟的空间

时空复杂度也是个惊人数字

所以我们必须想办法来优化我们的思路。

其实

对于我们每一个给出的区间,

它们被覆盖的长度就是(右端点-左端点)

只不过有些区间是互相有一部分覆盖了而已。

那么应该怎么办呢?

有些人可能会想,我们只要计算出总长度,然后减去一次重复的区域。

这样或许可以,但,我们可以从根本入手

我们只需要想办法将这些会重复计算的地方只计算一次,那么问题就迎难而解了。

怎么才能只计算一次?————单元化计算(其实这也就是数组标记的思想)

还是上面那个例子:

给出三对区间

第一对区间:[1,3)

找到这个区间的两个端点:1,3

将 [1,3) 所在的区间打上标记(别忘记左闭右开)

也就是,  1  , 2 被打上了标记(这标记有什么用,后面就知道了)

第二对区间:[2,6) 

找到这个区间的端点:2,6

将 [2,6) 所在的区间打上标记

也就是,  2,3,4,5  被打上了标记

第三对区间:[4,8)

依次类推:

那么被打上标记的数字就是这些:

-3  -2 -1  0  1  2  3  4  5  6  7  8 9 10 11 

我们只要对所有打上标记的数字进行一项操作:ans = a[i+1] - a[i]   (差分的思想)

并将这个操作累加起来:ans += a[i+1] - a[i]   

ans = 2-1 + 3-2  + 4-3 + 5-4  + 6-5 + 7-6  + 8-7 = 7

这样的话,我们就不需要考虑会不会有重复区间的情况了,因为所有的数据只算了一遍

到这里,可能有些人坐不住了,你这有啥用啊,这么麻烦,还不如我直接手算呢。

欸,别急,这些只是小数据罢了,等到它是大数据的时候,就很有效果了。

另外,这样的操作,虽然看上去复杂,但是很好实现啊,你难道没发现每一步都是程序化的步骤么,所以有时候我们要站在电脑的角度去思考,瞪眼法虽好,但是很难以用程序来实现。

所以我们就可以引入离散化了(排序,去重,二分查找)

将每一对区间的左右端点当成一个个散点,将其放入数组里面:(这里不清楚的就去看看离散化的概念,很简单的,等你明白离散化是啥了之后再回来看看)

一共六组数字

[-2^31,-2^16)

[-65462131,-16846952)

[0,465)

[241,1321464)

[32137946,2^31)

数组下标12345678910
散点-2^31-2^16-65462131-1684695204652411321464321379462^31

将这一串数字进行排序:

数组下标12345678910
散点-2^31-65462131-16846952-2^1602414561321464321379462^31

紧接着把这个数组进行去重:(本组数据没有重复的,所以忽略) 

离散化的最后一步就是二分查找数据的位置

并结合我们刚刚说过的概念:单元化处理。

还记得单元化处理的第一步是什么吗?(翻上去看看)

找到第一对区间的端点在数组中的位置:(用二分查找找端点,这也就是为什么我们要去重的原因)

第一对端点:-2^31,   -2^16

可以用lower_bound()来进行二分

也可以用手动二分查找

得到位置:1,4

所以我们给[1,4)打上标记(不知道为啥打标记的翻上去看那个更简单的例子,再简单描述一下就是为了方便一项一项地处理,并且所有的数只会计算一次,不信的话你随便写几对数字模拟一下)

打标记:flag[i]=1

以此类推。

最后一步就是单项求和:

如果这个数字被打上了标记,那么我们就进行单元化处理 ans+= a[i+1] - a[i]

最后输出ans就好了

上代码:

const int N = 2e4 + 10;
int n, l[N], r[N], flag[2 * N], temp[2 * N], a,b ;
long long fn[2 * N], ans;
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> l[i] >> r[i];
		temp[++a] = l[i];
		temp[++a] = r[i];
	}
	sort(temp + 1, temp + 1 + a);
	for (int i = 1; i <= a;i++)
	{
		if (i == 1 or temp[i] != temp[i - 1])fn[++b] = temp[i];
	}
	for (int i = 1; i <= n; i++)
	{
		int L = lower_bound(fn + 1, fn + 1 + b, l[i]) - fn;
		int R = lower_bound(fn + 1, fn + 1 + b, r[i]) - fn;
		for (int j = L; j < R; j++)
			flag[j] = 1;
	}
	for (int i = 1; i < b; i++)
		if (flag[i])ans += fn[i + 1] - fn[i];
	cout << ans;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AM335x USB Boot详细说明

首先&#xff0c;要rev2.1的芯片才支持&#xff0c;以前的cpu有bug&#xff0c;无法使用usb boot 上位机需要uniflash&#xff0c; 以太网上截取的报文&#xff0c;可以进入第一阶段 AM335x自动从c:\am335x_flashtool\images目录下下载u-boot-spl-restore.bin http://process…

RFID技术在危险废物管理中的应用解决方案

一、背景介绍 随着我国经济的快速发展&#xff0c;轻纺、化工、制药、电子等行业的危险废物排放量逐年增加。然而&#xff0c;由于危险废弃物处理不当&#xff0c;可能导致大气、水体和土壤污染&#xff0c;对环境和人体健康造成严重威胁&#xff0c;制约了经济和健康的可持续…

Linux-查询目录下包含的目录数或文件数

1. 前置 1&#xff09;ls Linux最常用的命令之一&#xff0c;列出该目录下的包含内容。 -l&#xff1a;use a long listing format-以列表的形式展现 -R&#xff1a;list subdirectories recursively-递归列出子目录 2&#xff09;| 管道符 将上一条命令的输出&#xff…

调研了一下java常用的几个图片处理工具对Tiff文件的支持

ImageMagick 官网 https://imagemagick.org/&#xff0c; 支持多种格式。命令行工具很适合调试。功能很强大. 还有一款工具GraphicsMagick 是从ImageMagick的基础上研发出来的。 OpenCV 官网 https://opencv.org/ &#xff0c; github地址https://github.com/opencv/opencv&…

Springboot项目中打印SQL语句日志

在项目中我想查看自己的SQL语句是什么&#xff0c;就是如下图的内容&#xff1a; 方法一&#xff1a;&#xff08;我常用的&#xff09; 可以在项目中的.yml配置文件中添加如下内容&#xff1a; logging:level:com.uyun.bankbranchalert.mapper: debug其中com.uyun.bankbran…

如何挑选猫主食罐头?宠物店自用的5款猫主食罐头推荐!

临近双十二大促&#xff0c;是时候给家里的猫主子屯猫主食罐头了。许多铲屎官看大促的各种品牌宣传&#xff0c;看到眼花缭乱&#xff0c;不知道选哪些猫主食罐头好&#xff0c;胡乱选又怕踩坑。 猫罐头侠闪亮登场&#xff01;如何挑选猫主食罐头&#xff1f;作为经营宠物店7年…

开启核磁数据处理新篇章-MestReNova(MNOVA14)助您轻松解读科学界密码

在科学研究领域&#xff0c;核磁共振&#xff08;NMR&#xff09;技术被广泛应用于分析和解读化学物质的结构和性质。而MestReNova&#xff08;MNOVA14&#xff09;作为一款专业的核磁数据处理软件&#xff0c;凭借其强大的功能和易用性&#xff0c;已成为众多科研人员的首选工…

百度曹海涛:生成式AI正从“探索能力边界”向“推动应用落地”过渡

11月9日&#xff0c;以“星云棋布&#xff0c;步步为‘赢’”为主题的2023 IDC中国生态峰会在北京举办。会上&#xff0c;IDC中国区总裁霍锦洁女士的发表致辞。同时&#xff0c;IDC生态伙伴和行业领袖从多重维度分析了AI技术应用的发展&#xff0c;以及对于整体IT生态所产生的影…

【QT HTTP】使用QtNetwork模块制作基于HTTP请求的C/S架构

目录 0 引言1 HTTP基本知识1.1 请求类型1.2 HTTP请求报文格式1.3 HTTP响应报文格式1.4 拓展&#xff1a;GET vs POST 请求方法GET请求请求报文&#xff1a;响应报文 POST请求请求报文响应报文 其他注意事项示例&#xff1a;GET请求示例POST请求示例 2 实战2.1 QtNetwork模块介绍…

FPGA时序分析与约束(13)——I/O接口约束

一、概述 在应用了时钟约束后&#xff0c;所有寄存器到寄存器的路径都能定时。为了获得更加精准的FPGA外部时序信息&#xff0c;设计者需要为FPGA的I/O接口指定时序信息&#xff0c;一般时序工具只能获取FPGA器件内部的时序信息&#xff0c;对于FPGA器件引脚之外的时序信息&…

Feature Pyramid Networks for Object Detection(2017.4)

文章目录 Abstract1. Introduction3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 7. Conclusion FPN Abstract 特征金字塔是识别系统中检测不同尺度物体的基本组成部分。但最近的深度学习对象检测器避免了金字塔表示&#xff0c;部分…

Swift的Copy on Write 简称CoW

了解Copy on Write在Swift开发时非常重要&#xff0c;因为这是Swift Standard Library的一个基础特性。 值类型&#xff1a;struct&#xff0c;enum&#xff0c;和tuple&#xff0c;比如在调用函数时传递参数&#xff0c;就会发送副本拷贝 引用类型&#xff1a;class&#xff…

用户的生命周期

用户生命周期是指用户在产品使用过程中的状态变化&#xff0c;一般分为5个阶段&#xff0c;分别为引入期、成长期、成熟期、沉默期和流失期。用户生命周期能够反映不同阶段用户的状态&#xff0c;可根据用户的不同状态进行针对性运营。运营中常说的拉新、促活、留存就是基于用户…

SLAM中提到的相机位姿到底指什么?

不小心又绕进去了&#xff0c;所以掰一下。 以我个人最直观的理解&#xff0c;假设无旋转&#xff0c;相机在世界坐标系的(5,0,0)^T的位置上&#xff0c;所谓“位姿”&#xff0c;应该反映相机的位置&#xff0c;所以相机位姿应该如下&#xff1a; Eigen::Matrix4d T Eigen::M…

上位机模块之halcon绘制ROI与获取ROI,在hsmartwindow实现

在上位机中通常需要使用到绘制ROI模块或者获取已经绘制好的ROI区域的参数&#xff0c;在这里通过使用hsmartwindow窗体控件进行对ROI的绘制和获取。 先上代码&#xff1a; /// <summary>/// 创建ROI/// </summary>/// <param name"Win">传入HSmar…

Centos7安装frps作内网穿透--实现外部访问家里群晖

实现在外可访问家用群晖 需要在外界访问家里的局域网设备&#xff0c;正常情况是需要有公网IP&#xff0c;而IPV4作为家用&#xff0c;运营商基本不给&#xff0c;除非钞能力&#xff0c;IPV6可以用&#xff0c;但是有缺陷&#xff0c;需要互访的两端都是IPV6才能访问。选择fr…

Mysql删除占用事务的线程

参考&#xff1a;https://www.jianshu.com/p/dd0291391188 产生原因&#xff1a;这个问题的原因是在mysql中产生了事务A&#xff0c;执行了修改的语句&#xff0c;比如&#xff1a; update t1 set aget18 where id1;此时事务并未进行提交&#xff0c;事务B开始运行&#xff0c…

kubernetes集群编排(10)

目录 prometheus监控 部署prometheus 部署nginx监控实例 部署prometheus-adapter prometheus监控 部署prometheus 创建项目仓库并上传镜像 [rootk8s2 helm]# vim prometheus-values.yaml alertmanager:alertmanagerSpec:image:repository: prometheus/alertmanagertag: v0.24.0…

知识解读:香港轻量云/云服务器/VPS性能差距解读

​  提起香港轻量云/云服务器/VPS 这三类&#xff0c;往往汇聚了中小企业和开发者等群体的讨论声音。当然&#xff0c;这跟它们本身产品定位有关&#xff0c;加上在初级配置这块价格上相差不大&#xff0c;也因此经常被拿来对比。 首先来简单了解一下最基础的区别&#xff1a…