基础算法(七)——离散化

news2025/1/2 3:30:14

离散化

介绍

这里的离散化,特指整数的、保序的离散化

有些题目可能需要以数据作为下标来操作,但题目给出的数据的值比较大,但是数据个数比较小。此时就需要将数据映射到和数据个数数量级相同的区间,这就是离散化,即哈希映射。

举个例子,数据值域范围0~10e9数据个数范围0~10e5,我们不可能开一个10e9的数组去存储,因此我们需要将数据映射到从0开始的自然数,即0~10e5,这样我们只需要开一个10e5的数组就可以去存储对应下标的一些值了。

核心思想:

  • 单调性(排序):首先数据必须保证是单调的,这样才能保证前后顺序不变
  • 唯一性(去重):数据内没有重复的数字,因为作为下标,应当是独一无二的
  • 查找映射值(二分):当数据序列经过了排序、去重等操作,它们在序列中本身的位置,即下标,就是他们离散化后的结果。查询一个数在数组中的下标,因为单调性,因此我们可以使用二分,而且因为去重的原因,我们的二分不用考虑重复数字。

模板代码:

// 去重
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; // 这里+1是映射到了1,2,...,n
}

例题

pSED16P.png

思路:

将原来的[-10e9, 10e9]区间vector<pair<int, int>> alls通过离散化映射到[1, 3*10e5]区间int a[N],然后通过前缀和求取a[N]的区间和。

这里N为什么是3*10e5呢:

  • 因为题目后面对离散化数字进行了m次访问求区间和,求区间和是通过前缀和来做,因前缀和数组int s[N]在初始化过程是需要访问离散化数组的,因此访问的左右端点也需要加入到离散化数组中。

  • 这里的左右端点数据量为2*m,即2*10e5,原本的数据个数是n,即10e5,故最终的N = 2*m + n = 3 * 10e5

代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

const int N = 3*10e5 + 10;

int a[N], s[N]; // a代表离散化后的数组,s是a的前缀和

typedef pair<int, int> PII;

vector<PII> adds, query;
vector<int> alls;

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; // 这里加1是为了将x映射到1,2,...,n的区间
}

int main()
{
    int n, m;
    cin >> n >> m;
    for(int i = 0; i < n ; i ++ )
    {
        int x, c;
        cin >> x >> c;
        adds.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 : adds)
    {
        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/146676.html

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

相关文章

基于imx6ull第一个Linux驱动

在编译第一个驱动之前&#xff0c;需要把基本的环境准备好&#xff0c;可以参照这两篇文章&#xff1a;https://wlink.blog.csdn.net/article/details/128590747https://wlink.blog.csdn.net/article/details/128591216我们之前写过一个基于ubuntu最基本的字符设备驱动&#xf…

关于固态硬盘冷数据掉速问题解决方案

20230107 By wdhuag 前言&#xff1a; 我有一个西数蓝盘500G固态&#xff0c;系统盘&#xff0c;一年没开机&#xff0c;这个月开机后发现系统很卡&#xff0c;持续读取假死严重。测试没有坏块&#xff0c;网上说的是冷数据掉速问题。 参考&#xff1a; 如何看待西数/闪迪多…

排序算法:插入、希尔、选择、冒泡

目录 一.插入排序 1.算法描述&#xff1a; 2.实现思路&#xff1a; 3.时间复杂度&#xff1a; 代码如下&#xff1a; 二.希尔排序 &#xff08;插入排序的优化升级&#xff09; 1.算法描述&#xff1a; 2.实现思路&#xff1a; 3.时间复杂度&#xff1a; 代码如下&a…

【算法笔记】最近公共祖先(LCA)问题求解——倍增算法

0. 前言 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节点的最近公共祖先&#xff0c;就是这两个点的公共祖先里面&#xff0c;离根最远的那个。 这种算法应用很广泛&#xff0c;可以很容易解决树上最短路等问题。 为了方便&#xff0c;我们记…

星光不负赶路人|2022年终总结

时间真快&#xff0c;转眼又是年末。整理一篇文章来给自己好好做一次年终盘点&#xff0c;本着陈述事实&#xff0c;提炼精华&#xff0c;总结不足的思路&#xff0c;给自己这一年的工作、生活、成长画个句号。 工作 &#x1f3e2; 从经海路到中关村 去年换了工作&#xff0c…

Java设计模式中的创建者模式/单例模式是啥?单例模式其中的饿汉式与懒汉式又是啥?又可以用在哪些地方

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 4. 创建者模式 4.1 特点 使用者不需要知道对象的创建细节 4.2 单例模式 4.2.1使用场景 单例类&#xff1a;且仅能创建一个实例类访问类&#xff1a;使用单例类…

七、Gtk4-Defining a final class

1 定义一个最终类 1.1 一个非常简单的编辑器 在上一节中&#xff0c;我们创建了一个非常简单的文件查看器。现在我们继续重写它&#xff0c;并将其转换为非常简单的编辑器。它的源文件是tfe目录下的tfe1.c(文本文件编辑器1)。 GtkTextView是一个多行编辑器。因此&#xff0c…

java学习day71(乐友商城)购物车实现

今日目标&#xff1a; 1.实现未登录状态的购物车 2.实现登陆状态下的购物车 1.搭建购物车服务 1.1.创建module 1.2.pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&…

软件测试~测试分类

目录 1.按照是否查看代码划分 ① 黑盒测试(Black-box Testing) ② 白盒测试(White-box Testing) ③ 灰盒测试(Gray-Box Testing) 2.按照开发阶段划分 ① 单元测试(Unit Testing) ② 集成测试(Integration Testing) ③ 系统测试(System Testing) ④ 验收测试(Acceptance…

kNN分类

一、 概述 kNN(k nearest neighbor,k近邻)是一种基础分类算法&#xff0c;基于“物以类聚”的思想&#xff0c;将一个样本的类别归于它的邻近样本。 ![在这里插入图片描述] 二、算法描述 1.基本原理 给定训练数据集 T{(x1,y1),(x2,y2),...,(xN,yN)}T\left\{ \left( x_1,y_1 …

17. XML

文章目录一、XML概念二、XML语法1、基础语法2、快速入门3、组成部分4、约束1. 约束概述2. 分类3. DTD4. Schema三、XML解析1、操作xml文档2、 解析xml的方式1. DOM2. SAX3. xml常见的解析器&#xff08;工具包&#xff09;4. Jsoup&#xff08;1&#xff09;快速入门&#xff0…

VUE3 学习笔记(一):环境配置、项目创建

一、首先需要安装node.jsnodejs官网&#xff1a;Node.js (nodejs.org)下载安装包&#xff1a;下载稳定版本即可&#xff0c;目前&#xff08;2023-01-07&#xff09;是18.13.0版本c. 检查当前版本&#xff08;CMD&#xff09;&#xff1a;至此&#xff0c;nodejs已经安装成功&a…

电力系统机组组合(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

EM算法学习总结

序 这个和我的硕士毕业论文的题目就有一定关系&#xff0c;我的导师让我按时向她汇报学习进度。然而我还在进行实习&#xff0c;还要准备自己明年的秋招&#xff0c;只能想办法游走于三者之间。 EM算法是一个常用的数据挖掘算法&#xff0c;想必从事数据挖掘的相关工作的同学…

机器人操作系统ROS/ROS2(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、ROS和ROS2是什么&#xff1f;二、ROS2安装步骤1.Ubuntu虚拟机安装2.ROS2系统安装3.验证ROS2安装成功4.小海龟仿真示例总结前言 提示&#xff1a;这里可以添…

LeetCode刷题模版:21 - 30

目录 简介21. 合并两个有序链表22. 括号生成23. 合并K个升序链表24. 两两交换链表中的节点25. K 个一组翻转链表26. 删除有序数组中的重复项27. 移除元素28. 找出字符串中第一个匹配项的下标29. 两数相除【未理解】30. 串联所有单词的子串【未理解】结语简介 Hello! 非常感谢您…

devops 是什么东东了

DevOps&#xff0c;字面意思是Development &Operations的缩写。 DevOps是从实践中逐步总结提炼出的方法论理念。近而创造了DevOps这个词。 DevOps概念的萌芽阶段&#xff1a; 2008年敏捷大会上&#xff0c;来自Patrick Debois发表了题为 《Agile Infrastructure & Op…

基于.NET技术的动漫管理系统,给各位二次元老司机提供的动漫管理平台,基于.NET的前后端框架Blazor,含安装教程及使用说明

介绍 老司机驾驶舱——给各位二次元老司机提供的动漫管理平台。 下载地址&#xff1a;基于.NET技术的动漫管理系统 编写本应用的目的主要是实践巨硬&#xff08;Microsoft&#xff09;的新一代前端框架Blazor与EntityFramework&#xff0c;本应用也给想要学习这套框架的童鞋提…

Ubuntu20.04 hyperledger fabric2.4基于Docker搭建blockchain-explorer

准备 启动fabric测试网络。   这里默认已经完成了Fabric测试网络搭建以及运行。   后续会出Fabric安装&#xff0c;现在不会的就先去看别的博客 配置 1.在test-network 文件夹下面建立explorer文件夹&#xff1a; mkdir explorer2. 配置文件 2.1下载配置文件 先进文件…

Isaac Sim 机器人仿真器介绍、安装与 Docker [1]

前言与参考 此文书写于&#xff1a; January 6, 2023&#xff0c; 更新于 January 6, 2023 &#xff1b;可能会随着时间的变化 此教程会有过时概念哦 Isaac Sim 相关参考链接&#xff1a; 官方文档地址官方docker image 镜像地址官方讨论 论坛链接&#xff0c;建议没啥事就可…