C++ 离散化 算法 (详解)+ 例题

1、性质

  • 无限空间中有限的个体映射到有限的空间中去,以此提高算法的空间效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的压缩。

  • 适用范围:数的跨度很大,用的数很稀疏

  • 例如:值域:1~10^9, 个数:10^5,值域很大,但是用到个数相对很少,这个时候就可以离散化

    • 比如:将

      a[i] : 1 3 100 2000 50000//这里需要注意可以离散化的前提是数组元素必须是有序的
        i  : 0 1  2    3    4  //上面数字映射(离散化)后对应的下标

2、实现方式

  • 我觉得离散化(映射)最大的难点是前后映射关系,如何能够将不连续的点映射到连续的数组的下标。此处的解决办法就是开辟额外的数组alls[])存放原来的数组下标(被离散化的数的下标)。

  • 手动模拟如下:

    • 对于一组数如 :[1,3,2000,50000,-99,2000,3,30],首先排序去重后----->[-99,1,3,30,2000,50000]
      从排序去重后数组可以得到关系:-99 --> 0, 1 --> 1 , 3 --> 2, 30 -->3 ..........
      上面对应的0,1,2,3,......都是此数字映射后对应的相对下标
    • 离散化基本步骤可分为:

      1、离散化一定是有序的去离散化(排序)

      2、alls[]中可能存在重复元素(所以 去重)

      3、 如何算出X求映射的下标)离散化后的值 (二分查找)

      注意:对于上述第三条,可以理解为去找这个数映射后的数组下标。

  • 代码模板:

    • vector<int> alls; //存储所有待离散化的值
      sort(alls.begin(),alls.begin());//将所有值排序
      alls.erase(unique(alls.begin(),alls.end()),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 r+1;//这里加1映射到(1,2,3,4.......n),不加1的话映射到(0,1,2,3.....n)
      }
  • 关于代码中的unique函数和erase函数:

如何自己实现unique函数:

例如:[1,1,2,2,2,3,4,5,5,5,6];
分为两步:
1、首先它是第一个元素
2、a[i] != a[i+1]

unique函数实现代码(双指针算法):

vector<int> ::interator unique(vector<int> &a)
{
    for(int i=0;j=0;i<a.size();i++)
    {
        if(!i || a[i] != a[i-1])
        {
            a[j++] = a[i];
        }
    }
    //a[0]~a[j-1]中存的所有a[i]中不重复的数
    rerturn a.begin()+j;
}

3、例题:802. 区间和 - AcWing题库

假定有一个无限长的数轴,数轴上每个坐标上的数都是 00。
​
现在,我们首先进行 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

  • 图解+分析(来源于大佬的题解分析):

 

 

AC代码: 

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

using namespace std;

typedef pair<int, int> PII;

//这里开30W是因为n个x操作和2*m个坐标
const int N = 3e5+10;
int a[N],s[N];//前缀和数组
int n,m;
vector<int> alls;//离散化数组(对应下标值)
vector<PII> add,query;

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;
    }
    //如果+1映射从1,2,3........
    //否则从0,1,2,3、、、、、、、
    return r + 1;//返回映射
}

int main()
{
    cin >> n >> m;
    for(int i=0;i<n;i++)
    {
        int x,c;
        cin >> x >> c;
        //添加该位置加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());//排序
    //unique:返回去重后最后一个不重复元素的位置
    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;
}

 

代码+样例模拟: 

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

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

相关文章

无形的伤害

有时候 我们往往很注意和陌生人或朋友之间的交往&#xff0c;关注情绪&#xff0c;语气&#xff0c;声调等等&#xff0c;生怕冲撞唐突了对方。 但往往会忽略身边人的感受&#xff0c;尤其是亲人和亲密的朋友&#xff0c;把他们对我们的关心当做理所当然的&#xff0c;和他们交…

Sora技术和影响分析

与现有生成工具比的优势 现有的文生图工具有Midjourney、Stable Diffusion、文心一格等&#xff0c;支持不同风格的内容生成&#xff0c;支持lora模型训练&#xff0c;此领域发展相对比较成熟。 而在文生视频领域&#xff0c;其难度相对更高&#xff0c;要求画面连续、清晰度…

OpenMVG(特征匹配、照片组重建点云、GPS位置信息、GMS)

目录 1 图像的特征匹配 2 图像中提取GPS位置信息 2.1 写入GPS信息到图像中 2.2 读取带有GPS的图像 3 SIFT/AKAZE/AKAZE_MLDB特征提取对比 4 GMS Filter 5 将球形全景图转换为6个透视视图 6 照片组重建点云 1 图像的特征匹配 #include "openMVG/features/feature.…

BUGKU-WEB source

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 看源码&#xff0c;看F12网络请求没有东西只能老老实实按照提示用Linux去扫描目录 相关工具 kali虚拟机安装gobuster 或者dirsearch 解题步骤 先查看源码&#xff1a; flag{Zmxhz19ub3RfaGvyzS…

Ubuntu22.04LTS编译Frida历史版本,环境配制及细节调整

经常使用Frida的朋友们可能会遇到Frida的各种问题需要自定义的&#xff0c;而这时候Frida的本地编译就显得很重要了。 最近一位朋友发现使用Frida14/15/16版的server只能连拉一定数量的设备&#xff0c;超过了frida-device-manager便不能连接设备。 实现没有办法&#xff0c;…

vue创建项目报:Error: command failed: yarn

我的文件在&#xff1a;C:\Users\Administrator 下 原来里面 useTaobaoRegistry 是否使用淘宝源 是 false &#xff0c;我改为true就好了 也可以 packageManager 默认安装工具 改为 npm 或 cnpm 原文连接&#xff1a;vue创建项目报&#xff1a;Error: command failed: yarn-阿…

Stable Diffusion教程——常用插件安装与测试(一)

前言 随着Stable Diffusion不断演进&#xff0c;越来越多的开发者开始涉足插件开发。尽管网络上存在大量教程&#xff0c;但它们通常零散分布&#xff0c;逐个学习和查找非常耗时&#xff0c;使人感觉每天都在劳累思考。这里总结了Stable Diffusion常用的插件安装与测试方法。…

搭建智能调度系统:同城代驾小程序的开发教学

当下&#xff0c;同城代驾服务越来越受到人们的青睐。为了满足市场需求&#xff0c;许多企业开始开发智能调度系统&#xff0c;以提高服务效率和用户体验。本文将介绍如何搭建一个智能调度系统&#xff0c;并以同城代驾小程序的开发为例进行详细教学。 第一步&#xff1a;需求…

科技守护大唐遗宝,预防保护传承千年

​ 一、“大唐遗宝——何家村窖藏出土文物展” 陕西历史博物馆的“唐朝遗宝——何家村窖藏出土文物展”算得上是博物馆展览的典范。展览不仅在于展现了数量之多、等级之高、种类之全&#xff0c;更在于对唐朝历史文化的深入揭露。 走入大唐财产展厅&#xff0c;好像穿越千年前…

The Captainz NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;The Captainz NFT Collection Dashboard The Captainz 是 Memeland 的旗舰系列&#xff0c;由 9,999 个实用性极强的 PFP 组成。持有者在 Memeland 宇宙中展开了一场神…

【Python】测量WAV文件播放时长

问题 windows播放WAV音频文件&#xff0c;一般使用API函数&#xff0c;如PlaySound。实际使用发现&#xff0c;从调用PlaySound到实际开始播放存在200ms以上的延时&#xff0c;在游戏编程中音效实时性是个需要解决的问题。 本文主要讨论&#xff0c;windows播放WAV文件的衍生…

2024 VNCTF----misc---sqlshark sql盲注+流量分析

流量分析 wireshark 可以看到很多 any/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 1 fOr 1))))in(80))),1,0))# P any/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 1 fOr 1))))in(104))),1,0))#…

基于springboot智慧外贸平台源码和论文

网络的广泛应用给生活带来了十分的便利。所以把智慧外贸管理与现在网络相结合&#xff0c;利用java技术建设智慧外贸平台&#xff0c;实现智慧外贸的信息化。则对于进一步提高智慧外贸管理发展&#xff0c;丰富智慧外贸管理经验能起到不少的促进作用。 智慧外贸平台能够通过互…

Vue3

目录 一、 Vue3简介 1. 性能的提升 2. 源码的升级 3. 拥抱TypeScript 4. 新的特性 二、 创建Vue3工程 1. 基于 vue-cli 创建 2. 基于 vite 创建(推荐) 3. 一个简单的效果 三、Vue3核心语法 1. OptionsAPI 与 CompositionAPI &#xff08;1&#xff09;Options API …

前端vue金额用逗号分隔

实现效果 代码 template部分 <el-input v-model"state.val"></el-input><div>{{ priceFor(state.val) }}</div> js部分 const state reactive({ val: });const priceFor (val)> {if(!val){return }else if(val.length<4){return…

IP定位技术助力网络安全保护

随着网络技术的不断发展&#xff0c;网络安全问题日益凸显&#xff0c;如何有效保护网络安全已成为亟待解决的问题。IP定位技术作为一种前沿的网络安全防护手段&#xff0c;正在逐步成为网络安全保护的重要工具。 首先&#xff0c;我们要明确什么是IP定位技术。IP定位技术是一…

Instagram 账号被封如何申诉?ins账号解封经验分享

不知道各位在玩转海外社媒平台时有没有遇到过Instagram账号异常的情况&#xff0c;比如会出现账号受限、帖子发不出去、账号被封号等情况?Instagram账号如果被封不用马上弃用&#xff0c;我们可以先尝试一下申诉&#xff0c;看看能不能把账号解封。所以今天将会出一篇Instagra…

OpenAI视频生成模型Sora背后的技术及其深远的影响

前言 Sora的视频生成技术在保真度、长度、稳定性、一致性、分辨率和文字理解等方面都达到了当前最优水平。其核心技术包括使用视觉块编码将不同格式的视频统一编码成Transformer可训练的嵌入向量&#xff0c;以及类似于扩散过程的UNet方法进行降维和升维的加噪与去噪操作。通过…

19.Qt 组合框的实现和应用

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 1. 界面 2.槽 3.样式表 参考&#xff1a; 前言&#xff1a; 学习QCombox控件的使用 技能&#xff1a; 简单实现组合框效果 内容&#xff1a; 1. 界面 在ui编辑界面找到input widget里面的comboBox&#xff…

Cesium 问题——加载 gltf 格式的模型之后太小,如何让相机视角拉近

文章目录 问题分析问题 刚加载的模型太小,如何拉近视角放大 分析 在这里有两种方式进行拉近视角, 一种是点击复位进行视角拉近一种是刚加载就直接拉近视角// 模型三加载 this.damModel = new Cesium.Entity({name: "gltf模型",position:</