基础算法---离散化

news2024/11/26 4:22:38

概念

离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。

通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。

也就是说当数据空间跨越太大,但是数据的个数却不多,我们可以使用离散化将许多无意义的操作去掉

例如 数组的长度是10^9 但是只有100000个下标上的值不为0 ,当我们需要求某个区间[l,r]内的和 ,如果不离散化,就要从l开始遍历到r,才可以求出区间和,如果l和r相差很大,就会浪费很多时间,其中很多值为0,所以我们加了很多无意义的数

离散化

有一组数据 {1,5000,60,99999,88,88}存到一个数组里后 ,先排序 ---> {1,60,88,88,5000,99999} 去重 --->{1,60,88,5000,99999} ,二分查找得到下标 {1,2,3,4,5}

为什么要排序? 为了等下查找数据的时候可以使用二分查找,例如查找60这个数字

为什么要去重? 要确保相同元素离散化的结果相同

看个题目

假定有一个无限长的数轴,数轴上每个坐标上的数都是 0 。

现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c 。

接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。

输入格式

第一行包含两个整数 n 和 m。

接下来 n 行,每行包含两个整数 x 和 c。

再接下来 m 行,每行包含两个整数 l 和 r 。

输出格式

共 m 行,每行输出一个询问中所求的区间内数字和。

数据范围

−10 ^9 ≤x≤ 10 ^9,

1≤n,m≤10^5,

−10^ 9 ≤l≤r≤ 10 ^9,

−10000≤c≤10000

输入样例:

3 3
1 2
3 6
7 5
1 3
4 6
7 8


输出样例:

8
0
5

#include <iostream>
#include <vector>

#include <algorithm> //sort函数的头文件
using namespace std;

const int N = 300010;
int a[N], s[N];

typedef pair<int, int>  PII;

vector <int> alls; // 存储着 x l r
vector <PII> insert; // 存储操作坐标x和增量c
vector <PII> inquiry; // 存储着询问区间 l 和 r

int find(int x) //二分查找: 找x l r 离散后的坐标
{
	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; // 坐标是从1开始的
}
int main(void)
{
	int n, m;
	cin >> n >> m;

	while (n--)
	{
		int x, c;
		cin >> x >> c;
		alls.push_back(x);
		insert.push_back({ x,c });
	}

	while (m--)
	{
		int l, r;
		cin >> l >> r;
		alls.push_back(l);
		alls.push_back(r);
		inquiry.push_back({ l,r });
	}

	//排序alls数组排的是l、r、x的顺序,再去重,去的也是l、r、x的重复数字
	sort(alls.begin(), alls.end()); 
	// unique函数是将重复的元素放到数组的后边(并未删去) 
	// 返回值是第一个重复元素的下标
	//erase函数删除区间的元素
	alls.erase(unique(alls.begin(), alls.end()), alls.end());

	/*for (auto item:vec)不改变迭代对象的值,效果是利用item遍历并获得vec容器中的每一个值*/
	for (auto item : insert)
	{
		int x = find(item.first);
		a[x] += item.second;
	}
	
	for (int i = 1; i <= alls.size(); i++)
	{
		s[i] = s[i - 1] + a[i]; //求a[i]前缀和
	}

	for (auto item : inquiry)
	{
		int l = find(item.first), r =find( item.second);
		printf("%d\n", s[r] - s[l - 1]);
	}

	return 0;
}

讲解

根据输入样例,原数据应该是这样的

将x l r 存入alls--->alls  1 3 7 1 3 4 6 7 8

排序去重 --> alls  1 3 4 6 7 8

--------------------------------------------------------------------------------------

然后intsert 数组存储着操作下标和加数    { 1 , 2 } { 3 , 6 } { 7, 5 }

inquiry数组存储着询问区间     { 1, 3 }  { 4 , 6 }  { 7 , 8 }

--------------------------------------------------------------------------------------

然后我们有一个a数组,我们利用二分查找找得 1   3   7 对应的下标为  1 2 5 ,在这些位置增加 2 6 5 ,那么就得到了a数组 

再把 区间 1 3 4 6 7 8利用二分得到离散化的坐标为  1 2 3 4 5 6

也就是说求[ 1 , 3 ]区间的和 就是求a数组 [ 1 ,  2 ] 区间的和 ... ...

到此得到答案

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

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

相关文章

Linux命令-文件展示

1、ls、ll命令——展示数据 ①ls命令——平铺展示数据 其中ls命令以平铺的方式展现数据 ②ll命令——列表展示数据 ll命令以列表的方式展现数据 -a选项&#xff0c;表示&#xff1a;all的意思&#xff0c;即列出全部文件&#xff08;包含隐藏的文件/文件夹&#xff09; -l选项…

Linux centos7 bash编程训练

训练编写一段代码&#xff0c;打印输出100之内的明7暗7&#xff0c;同时要求每5个数字打印在一行。 此项训练主要是考察for循环的使用&#xff0c;及条件判断表达式的设置和不同写法的应用。 常用的for循环有四种写法&#xff08;如打印1-100的整数&#xff09;&#xff1a; …

数据优化与可视化:3D开发工具HOOPS在BIM模型轻量化中的作用分析

在建筑和工程领域&#xff0c;BIM&#xff08;建筑信息建模&#xff09;是一种重要的数字化工具&#xff0c;但大型BIM模型往往需要大量的计算资源和存储空间。为了解决这一问题&#xff0c;HOOPS技术成为了一种关键工具&#xff0c;可以帮助实现BIM模型轻量化&#xff0c;提高…

docker 已经配置了国内镜像源,但是拉取镜像速度还是很慢(gcr.io、quay.io、ghcr.io)

前言 国内用户在使用 docker 时&#xff0c;想必都遇到过镜像拉取慢的问题&#xff0c;那是因为 docker 默认指向的镜像下载地址是 https://hub.docker.com&#xff0c;服务器在国外。 网上有关配置 docker 国内镜像源的教程很多&#xff0c;像 腾讯、阿里、网易 等等都会提供…

NVR添加rtsp流模拟GB28181视频通道

一、海康、大华监控摄像头和硬盘录像机接入GB28181平台配置 1、海康设备接入配置 通过web登录NVR管理系统&#xff0c;进入网络&#xff0c;高级配置界面&#xff0c;填入GB28181相关参数。 将对应项按刚才获取的配置信息填入即可&#xff0c;下面的视频通道的编码ID可以保持…

类和对象三大特性之继承

全文目录 继承的概念定义格式继承关系和访问限定符final 基类和派生类对象赋值转换继承中的作用域派生类的六个默认成员函数构造函数拷贝构造函数operator析构函数 友元和静态成员友元静态成员 各种继承形式菱形继承虚继承菱形虚拟继承对象模型 继承和组合 继承的概念 通过继承…

PyTorch深度学习(二)【反向传播、用pytorch实现线性回归】

反向传播 弄一个简单点的&#xff0c;两层的神经网络: 加入激活函数&#xff1a;&#xff08;不加激活函数的神经网络就是一个线性回归模型&#xff09; 用到的损失函数&#xff1a; pytorch里面的数据存储&#xff1a;tensor&#xff0c;它可以存标量、向量、矩阵、高维度数据…

帝国EmpireCMS_7.5_SC_UTF8漏洞复现

一、漏洞说明 EmpireCMS 7.5版本及之前版本在后台备份数据库时&#xff0c;未对数据库表名做验证&#xff0c;通过修改数据库表名 二、搭建环境 下载地址&#xff1a;http://www.phome.net/download/ 然后执行&#xff1a;http://127.0.0.1/EmpireCMS_7.5_SC_UTF8/upload/e/ins…

基于Levenberg-Marquardt算法的声源定位matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................................................... %ML if (bML1)varxs…

XGBoost实战2--数据预测保险赔偿

一、概述 本次实战基于给出的数据进行保险预测。数据集&#xff1a;Allstate Claims Severity | Kaggle 给出的训练数据是116列&#xff08;cat1-cat116&#xff09;的离散数据和14列&#xff08;con1-con14&#xff09;的连续数据。数据集中的每一行表示一个保险索赔。必须预…

Jina AI @Slush 上海 地表最酷科技创新大会来啦!

地表最酷的科技创新大会 S 创上海 2023 The Final Slush Shanghai 即将在 9 月 22 - 23 日空降上海 Jina AI 受邀参与本次大会&#xff0c;并带来好玩的互动&#xff01; 多种门票限时限量派送中 还在犹豫什么&#xff01;&#xff01; 就等你啦~ 什么是 S 创 2023 上海大会 本…

vulnhub靶机Thoth-Tech

下载地址&#xff1a;https://download.vulnhub.com/thothtech/Thoth-Tech.ova 主机发现 arp-scan -l 目标&#xff1a;192.168.21.148 端口扫描 nmap --min-rate 10000 -p- 192.168.21.148 服务扫描 nmap -sV -sT -O -p21,22,80 192.168.21.148 漏洞扫描 nmap --scriptvu…

IT技术2222

发布的方式 脚本 ansible 自动化&#xff0c;点点点

Mac电脑报错“托管配置文件格式不正确”的解决方法

本文介绍在Mac电脑中&#xff0c;复制地址链接后出现“托管配置文件格式不正确”这一报错的解决方法。 有时候&#xff0c;我们在把订阅地址粘贴到对应软件中时&#xff0c;会出现托管配置文件格式不正确: invalid mode: redir-host的报错。 出现这种报错&#xff0c;就意味着我…

座舱台架介绍与搭建流程

座舱台架介绍 车载测试中的座舱台架测试包括以下几个方面&#xff1a; 仪表盘&#xff1a;测试仪表盘的显示、功能、光线反射和防眩目性能等。评估仪表盘是否能够提供准确的驾驶信息&#xff0c;并能在各种光照条件下清晰可见。中控屏&#xff1a;测试中控屏的触摸响应、图像…

连接MySQL时报错:Public Key Retrieval is not allowed的解决方法

问题描述&#xff1a; DBeaver 连接 mysql 时报错&#xff1a;Public Key Retrieval is not allowed&#xff08;不允许公钥检索&#xff09; 解决方法&#xff1a; 连接设置 -> 驱动属性 -> allowPublicKeyRetrievalfalse&#xff08;这里的运输公钥检索是默认关闭的&a…

禁用Win10自动更新

第一步&#xff0c;winr&#xff0c;输入 gpedit.msc 并回车&#xff0c;打开【组策略】 第二步&#xff0c;依次点击 管理模板->Windows组件->Windows更新 第三步&#xff0c;双击Windows更新&#xff0c;然后在设置中双击 指定 intranet Microsoft 更新服务位置 第…

融合柯西变异和自适应莱维飞行的布谷鸟优化算法,改进布谷鸟,MATLAB代码

经常有小伙伴后台留言问&#xff1a; 作者改进的算法可不可以用来写论文呀&#xff1f; 回答是&#xff1a;当然可以&#xff01;且不用加引用&#xff01; 如果我的文章能帮助到大家写论文&#xff0c;那是作者的荣幸呀&#xff01; 布谷鸟优化算法是一个非常经典的优化算法&a…

视频怎么制作成gif动画?这个方法试试看

日常生活中我们会接触到这种各样的视频&#xff0c;随着拍摄工具的升级视频的画质越来越清楚体积也就越来越大。想要将这些视频转换成gif动图的时候要怎么操作呢&#xff1f;给大家推荐一款gif动画制作&#xff08;https://www.gif.cn/&#xff09;工具&#xff0c;上传视频仅需…