离散化(算法)

news2024/9/23 15:30:59

目录

  • 一、离散化的概念
  • 二、离散化的模板
  • 三、离散化的应用
    • 题目
    • 思路分析
    • 代码实现


一、离散化的概念

离散化是一种将连续数据映射到离散值的过程。它通常用于优化某些算法,尤其是与区间查询相关的问题。

在离散化过程中,我们将一组实数转换为一组整数,使得原始数据的顺序和区间关系得以保留。具体地说,我们将原始数据排序,然后为每个不同的值分配一个整数。这个整数是该值在排序后出现的位置,即离散化后的数值。

假设我们有以下一组实数:{ 3.5 , 2.1 , 5.6 , 1.2 , 3.5 3.5, 2.1, 5.6, 1.2, 3.5 3.5,2.1,5.6,1.2,3.5}。对它们进行排序后,得到 { 1.2 , 2.1 , 3.5 , 3.5 , 5.6 1.2, 2.1, 3.5, 3.5, 5.6 1.2,2.1,3.5,3.5,5.6}。接着,我们可以为每个不同的值分配一个整数,例如:

1.2 → 1 1.2 → 1 1.21
2.1 → 2 2.1 → 2 2.12
3.5 → 3 3.5 → 3 3.53
5.6 → 4 5.6 → 4 5.64

最终,我们将原始数据替换为离散化后的整数,得到 { 3 , 2 , 4 , 1 , 3 3, 2, 4, 1, 3 3,2,4,1,3} 。这些整数可以用于解决一些与区间查询相关的问题,例如线段树、树状数组等算法。


二、离散化的模板

vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(),all.end()); // 排序
alls.erase(unique(alls.begin(),alls.end()),alls.end()); //去重
// 二分求出x对应离散化的值
int find(int x)
	{
	// 找到第一个大于等于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 l;
}


三、离散化的应用

题目

假定有一个无限长的数轴,数轴上每个坐标上的数都是 0 0 0
现在,我们首先进行 n n n 次操作,每次操作将某一位置 x x x 上的数加 c c c
接下来,进行 m m m 次询问,每个询问包含两个整数 l l l r r r,你需要求出在区间 [ l , r ] [l,r] [l,r] 之间的所有数的和。

输入格式:
第一行包含两个整数 n n n m m m
接下来 n n n 行,每行包含两个整数 x x x c c c
再接下来 m m m 行,每行包含两个整数 l l l r r r

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

数据范围:
− 1 0 9 ≤ x ≤ 1 0 9 −10^9≤x≤10^9 109x109
1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105
1 ≤ m ≤ 1 0 5 1≤m≤10^5 1m105
− 1 0 9 ≤ l ≤ r ≤ 1 0 9 −10^9≤l≤r≤10^9 109lr109
− 10000 ≤ c ≤ 10000 −10000≤c≤10000 10000c10000

输入样例:

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

输出样例:

8
0
5

思路分析

由于 1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105 1 ≤ m ≤ 1 0 5 1≤m≤10^5 1m105 所掉用的数字范围较小,而数轴范围较大,故可以将通过离散化处理,将 − 1 0 9 -10^9 109 ~ 1 0 9 10^9 109范围缩为 1 0 5 10^5 105左右,大大提高效率。
思路分析

代码实现

tip:注意范围问题,s是从1开始的数组,所以可以通过调整二分法,将返回下标都加上1。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int, int> PII;
const int N = 3 * 1e5 + 10;
int a[N], s[N];
vector<int> alls;
vector<PII> add, query;

// 二分查找
int find(int x)
{
	int l = 0, r = alls.size() - 1;
	while (l < r)
	{
		int mid = l + ((r - l) >> 1);
		if (alls[mid] >= x) r = mid;
		else l = mid + 1;
	}
	return l + 1; // 由于S是从1开始的,所以对应映射位置都往前提一位
}
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; ++i)
	{
		int x, c;
		cin >> x >> c;
		add.push_back({x, c});
		alls.push_back(x);
	}
	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] = s[i - 1] + a[i];
	for (auto& item : query)
	{
		int l = find(item.first), r = find(item.second);
		cout << s[r] - s[l - 1] << endl;
	}
	return 0;
}

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

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

相关文章

美团企业版背后,费控和「know-how」的双重苦战

在企业消费管理的赛道里&#xff0c;美团不能算新手&#xff0c;但客观来看&#xff0c;也并不算是熟练的玩家。对这家中国骨灰级的玩家而言&#xff0c;这不仅是一场费控报销的仗&#xff0c;更是一个从C到B的观念转型之路。 作者|思杭 编辑|皮爷 出品|产业家 美团再出招。 …

从零构建自己的脚手架

从零构建自己的脚手架 简介 什么是CLI CLI 全称是 Command Line Interface&#xff0c;是一类通过命令行交互的终端工具。日常工作中常用的脚手架有 vue-cli、create-react-app、angular-cli 等&#xff0c;都是通过简单的初始化命令&#xff0c;完成内容的快速构建。 为什…

Unity Audio -- (3)创建3D音效

本节会添加场景中小瀑布的音效。小瀑布的音效会有一个作用范围&#xff0c;也会根据角色所处的位置不同&#xff0c;产生不同的效果。 添加小瀑布的声音 1. 在Hierarchy中&#xff0c;点击右键&#xff0c;选择Audio -> Create Audio Source&#xff0c;将这个新的Audio So…

HEVC学习之去方块滤波

一、概要 视频编码为视频带来的压缩伪影呈现出的效果各有不同&#xff0c;但其原因总结起来为高频信息的失真以及基于块的编码消除了块与块之间的相似性。 为了弥补基于块的编码带来的影响&#xff0c;HEVC中引入了去方块滤波。 AVC中采取对44块的边界进行去方块滤波&#xf…

通过自定义域名 + SSL 的方式访问 Amazon MQ for RabbitMQ

引言&#xff1a; 一般为了解决应用解耦&#xff0c;异步处理&#xff0c;流量削峰等问题&#xff0c;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性的架构&#xff1b;我们会引入消息队列中间件来完善架构设计。 对于需要消息传递协议的应用程序&#xff0c;…

CCFCSP 201409-2 画图

思路上很容易想到即使用一个标记数组对上过色的模块进行标记&#xff0c;最后遍历该数组得到被标记的模块数即可 #include<iostream>using namespace std;int mapp[105][105]; int ans0;int main(){int n;cin>>n;for(int i0;i<n;i){int x1,y1,x2,y2;cin>>…

【P15】JMeter 正则表达式提取器(Regular Expression Extractor)

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜&#xff1a; http://111.231.103.117/#/login 进入网页后&#xff0c;登录&#xff0c;页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12&#xff0c;打开调试工具&#xff0c;点击搜索 二、测试计划设…

【Java项目】SpringCloud项目注册到Nacos中心时显示的是内网IP导致不同服务器之间无法互相调用接口的解决并发

微服务项目地址—动动你发财的小手点一个stars吧 出现这个问题是之前我也就遇到过的&#xff0c;这个问题的情况就是&#xff1a; 我们知道微服务项目是可以把不同的项目部署在不同的服务器上从而减少某一台服务器的压力&#xff0c;我们只需要为每一个服务配置一个注册中心即…

计算机基础--计算机存储单位

一、介绍 计算机中表示文件大小、数据载体的存储容量或进程的数据消耗的信息单位。在计算机内部&#xff0c;信息都是釆用二进制的形式进行存储、运算、处理和传输的。信息存储单位有位、字节和字等几种。各种存储设备存储容量单位有KB、MB、GB和TB等几种。 二、基本存储单元…

【进阶知识】显示管理器,窗口管理器,桌面环境/桌面管理器,显示服务器

文章目录 一、显示管理器&#xff08;Display Manager&#xff09;1.1 什么是 Linux 中的显示管理器&#xff1f;1.2 不同的显示管理器1.3 其他控制台显示管理器图形界面显示管理器 二、窗口管理器&#xff08;Window Manager&#xff09;三、桌面环境/桌面管理器&#xff08;D…

AD9680之JESD204B接口2路、4路、8路的14bit 500MSPS/1GSPS/1.25GSPS采样率子卡的中文版本设计及调试经验资料分享

板卡概述&#xff1a; 【FMC155】 FMC155 是一款基于 VITA57.1 标准的&#xff0c;实现 2 路 14-bit、500MSPS/1GSPS/1.25GSPS 直流耦合 ADC 同步采集 FMC 子卡模 块。 该模块遵循 VITA57.1 规范&#xff0c;可直接与 FPGA 载卡配合使用&#xff0c;板 卡 ADC 器件采用 ADI 的…

MySQL基础篇补充 | 单行函数(数值函数、字符串函数、日期函数、流程控制函数、加密与解密函数、MySQL信息函数)

目录 一&#xff1a;单行函数 1. 数值函数 &#xff08;1&#xff09;基本函数 &#xff08;2&#xff09;角度与弧度互换函数 &#xff08;3&#xff09;三角函数 &#xff08;4&#xff09;指数与对数 &#xff08;5&#xff09;进制间的转换 2. 字符串函数 3. 日期和…

Nginx配置浏览器缓存,页面展示更快一步

1.简介 缓存能够存储请求的响应结果&#xff0c;可以很方便的再次访问&#xff0c;使用缓存的优点是很明显的。 加速内容的访问&#xff0c;降低响应时间减少服务器的负载 Nginx不仅仅是一个web服务器&#xff0c;它也是一个web缓存服务器。通过Nginx缓存&#xff0c;我们对…

Java引用类型(强引用,软引用,弱引用,虚引用)

从Java SE2开始&#xff0c;就提供了四种类型的引用&#xff1a;强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的&#xff1a;第一是可以让程序员通过代码的方式决定某些对象的生命周期&#xff1b;第二是有利于JVM进行垃圾回收。 强引用&#xff08…

【Linux环境】Linux常用命令记录汇总

Linux常用命令记录汇总 一、传输命令二、打包命令三、创建文件夹或文件命令四、切换用户五、vim相关命令六、权限更改命令 一、传输命令 命令格式&#xff1a; rz 点击回车 sz 文件名 点击回车命令解释&#xff1a; rz&#xff08;receive Zmodem缩写&#xff09;上传文件&am…

淘宝时光机入口在哪里怎么打开回溯20年淘宝历史账单?

淘宝时光机入口在哪里怎么打开&#xff1f; 打开淘宝时光机入口&#xff1a;https://www.caochai.com/article-4208.html &#xff0c;开始回溯20年淘宝历史账单&#xff1b; 淘宝大额内部隐藏优惠券怎么领取&#xff1f; 1、打开淘宝优惠券查询领取入口&#xff1a;https://…

上班摸鱼逛博客,逮到一个字节8年测试开发,聊过之后羞愧难当......

老话说的好&#xff0c;这人呐&#xff0c;一旦在某个领域鲜有敌手了&#xff0c;就会闲得某疼。前几天我在上班摸鱼刷博客的时候认识了一位字节测试开发大佬&#xff0c;在字节工作了8年&#xff0c;因为本人天赋比较高&#xff0c;平时工作也兢兢业业&#xff0c;现在企业内有…

好家伙,一天约了6场面试,又被吊打了....

好兄弟一天约了6场面试&#xff0c;又被吊打了 面试感受 先说一个字 是真的 “ 累 ” 安排的太满的后果可能就是一天只吃一顿饭&#xff0c;一直奔波在路上 不扯这个了&#xff0c;给大家说说面试吧&#xff0c;我工作大概两年多的时间&#xff0c;大家可以参考下 在整个面试…

mysql 连表查询

文章目录 一、内连接二、外连接2.1 左外连接2.2 右外连接 三、总结 写在前面 在MySQL中join操作被称为连接&#xff0c;作用是能连接多个表的数据&#xff08;通过连接条件&#xff09;&#xff0c;从多个表中获取数据合并在一起作为结果集返回给客户端。即使用连接查询一条SQL…

Redis 主从 + 哨兵模式搭建

前言&#xff1a;以Linux环境为示例 一、整体架构&#xff08;1主 2从 3哨兵&#xff09; 二、redis 安装 1、安装路径&#xff1a;/usr/local/redis/redis-6382&#xff08;可自行指定&#xff09; 2、解压安装包&#xff1a; 直接解压&#xff1a;tar -axvf redis-5.0.…