离散化【带题讲解】

news2024/12/25 12:19:24

全文目录

  • 🤔 原理
  • 😕 区间和
    • 😵‍💫 建立映射
    • 😵‍💫 查找映射的下标
    • 😵‍💫 代码

🤔 原理

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

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

有些数据本身很大, 自身无法作为数组的下标保存对应的属性。
如果这时只是需要这堆数据的相对属性,那么可以对其进行离散化处理。
当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。


😕 区间和

关说原理肯定是不行的,还是通过题目来加深理解。

原题链接

在这里插入图片描述

看到题目的第一眼可以确定的是,肯定是不能直接通过数组来进行操作,总不能直接开10^9 的数组吧,内存肯定是不够的。

可以发现每组数组中的有效数据是很稀疏的,那么我们就可以通过建立映射关系来创建一个新的数组,通过映射出来的数组进行区间和的操作。
在这里插入图片描述
映射出来的数组的下标的相对位置跟原数组的下标的相对位置保持不变,那么通过下标来求区间和,也可以通过映射关系来进行求解。


😵‍💫 建立映射

映射关系的建立通过原数组中有效数据的下标来建立:

将数组中有效数据的下标放进数组中,排序加去重(排序是为了让相对位置保持不变,去重是为了提高效率),我们就可以通过这个下标数组中原数组有效数据的下标对应的下标来确定有效数据在新数组中的位置,从而构建出新数组。

在这里插入图片描述


😵‍💫 查找映射的下标

寻找映射出来的下标时,下标数组是有序的,所以可以通过二分查找来进行查找。因为还涉及到前缀和的操作,所以我们需要将将返回的下标进行 +1 ,让下标从 1 开始,方便求前缀和数组。


😵‍💫 代码

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

using namespace std;

const int N = 300010;
int a[N], s[N];     // a[]:映射后的数组,s[]:a[]的前缀和数组
int n, m;   // 插入次数和查询次数
vector<int> alls;   // 所有数据的下标
vector<pair<int, int>> adds, querys;    // adds:插入的下标和值,querys:查询的下标

// 查找映射的下标
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;
}



int main()
{
    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;
        querys.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());
    
    // 通过映射构建数组 ,add.first一定能找到
    for (auto& add : adds)
    {
        int i = find(add.first);
        a[i] += add.second;
    }
    
    // 构建前缀和数组
    for (int i = 1; i <= alls.size(); i++)
    {
        s[i] = s[i - 1] + a[i];
    }
    
    // 通过映射来查询区间和
    for (auto& query : querys)
    {
        int l = find(query.first);
        int r = find(query.second);
        cout << s[r] - s[l - 1] << endl;
    }
    
    
    return 0;
}

完结散花🌈🌈🌈

在这里插入图片描述

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

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

相关文章

NVIDIA 安装 CUDA

名词解释&#xff1a;CUDA 是一个架构 该架构使GPU能够解决复杂的计算问题 此实战使用电脑为联想Y9000P 显卡型号为 3060 在安装 CUDA 之前需要先打开 NVIDIA 控制面板 一、准备工作 如图我这个显卡需要安装 CUDA 11.7 的版本 二、下载软件 进入官网下载 CUDA NVIDIA Deve…

解放军军官军衔(不含士兵军衔)分为3等10级

军衔&#xff0c;是国家最高权力机关授予军人的一种衔称。不同的级别有不同的军衔。对于军衔的认识&#xff0c;一些朋友或许只有片面的认识&#xff0c;下面&#xff0c;笔者就给大家来科普一下中国的军衔。 为了纪念中国人民解放军建军93周年&#xff0c;弘扬爱国主义精神&a…

被迫毕业,面试 30 家公司,终于上岸了!

大家好&#xff0c;我是君哥。今天分享一个老弟&#xff0c;被“毕业”后的求职经历。 在老东家干了 6 年&#xff0c;发展一般&#xff0c;很想出去&#xff0c;但是一直没有合适的机会&#xff0c;只好一边准备面试一边学习。让我没有想到的是&#xff0c;突然收到了“毕业”…

(1-线性回归问题)线性回归(Linear regression)Lasso回归和Ridge回归的区别

回归分析是机器学习中的经典算法之一&#xff0c;用途广泛&#xff0c;在用实际数据进行分析时&#xff0c;可能会遇到以下两种问题 过拟合, overfitting欠拟合, underfitting 在机器学习中&#xff0c;首先根据一批数据集来构建一个回归模型&#xff0c;然后在用另外一批数据…

Vue 中 (moment)操作日期的加减与展示

目录 基本语法 &#xff1a; 展示效果如下&#xff1a; 使用方式&#xff1a; 1、首先在 pacaage.json 中引入依赖 "moment": "^2.29.4" 2、然后命令行 install 安装 &#xff1a; 3、最后&#xff0c;在使用的页面引入moment 4、data 中我定义了一个…

python的Django项目中常见命令以及常错点(Linux环境下)

USE 数据库名 --------------- 切换数据库更新virtualenv库&#xff08;用于创建虚拟环境&#xff09;&#xff1a;sudo pip install -U virtualenv创建虚拟环境&#xff1a;virtualenv -p python venv(虚拟环境的目录名)激活虚拟环境&#xff1a;source venv/b…

利用Python处理excel表格,panda合并表格、合并多个excel、多个sheet

前言 记录一下&#xff0c;在使用pandas处理excel表格表格时候&#xff0c;关于分割(切分)表格这一块儿的操作。 这个系列会有三篇左右文章&#xff0c;这是第二篇&#xff0c;excel表格合并 我们常说的 excel文件&#xff0c; 在广义上&#xff0c;是指以 xls 或 xlsx 为后缀…

[1173]regexp_replace()和regexp_substr()函数的用法

文章目录REGEXP_REPLACE的使用方法命令格式&#xff1a;regexp_replace(source, pattern, replace_string, occurrence)参数说明返回值常用案例其他案例正则符号释义regexp_substr()函数的用法REGEXP_REPLACE的使用方法 命令格式&#xff1a;regexp_replace(source, pattern, r…

PF-Net基于深度学习的点云补全网络

1. 论文和代码 论文&#xff1a;https://openaccess.thecvf.com/content_CVPR_2020/papers/Huang_PF-Net_Point_Fractal_Network_for_3D_Point_Cloud_Completion_CVPR_2020_paper.pdfhttps://openaccess.thecvf.com/content_CVPR_2020/papers/Huang_PF-Net_Point_Fractal_Netw…

微信小程序开发 开启

小程序和普通网页开发的区别 1.运行环境不同 小程序是运行在微信环境中&#xff0c;而网页是运行在浏览器环境中。 2.API不同 由于运行环境不同&#xff0c;所以小程序中&#xff0c;无法调用DOM和BOM的API。 但是&#xff0c;小程序中可以调用微信环境提供的各种API&#…

Vue框架常用组件的快速构建项目Ctrl+c Ctrl+a Ctrl+v第十四课)

不管前方的路有多苦&#xff0c;只要走的方向正确&#xff0c;不管多么崎岖不平&#xff0c;都比站在原地更接近幸福。 在学习技术的道路上&#xff1a;落后又要被挨打。这是现实 常用到的组件库:下面的网站在自己空闲时间去看看 下面的资源只需要ctrlc ctrla ctrv Border 边框…

业务:财务软件之会计六要素

一、引言 会计六要素是资产、负债、所有者权益、收入、费用、利润。资产随处可见&#xff0c;比如房屋、机器设备、运输工具、仓库里的货物等。负债确认必须具备以下条件&#xff1a;负债是企业承担的现时义务&#xff1b;负债预期会导致经济利益流出企业&#xff1b;负债是由…

[附源码]计算机毕业设计JAVA学生宿舍设备报修

[附源码]计算机毕业设计JAVA学生宿舍设备报修 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

MobileOne实战:使用MobileOne实现图像分类任务(二)

文章目录训练导入项目使用的库设置全局参数图像预处理与增强读取数据设置模型定义训练和验证函数训练函数验证函数调用训练和验证方法再次训练再次训练的模型为什么只保存model.state_dict()关于加入EMA后验证集不得分的问题测试总结在上一篇文章中完成了前期的准备工作&#x…

C# 反射(一)基础概念

一、C# 反射&#xff08;refection&#xff09;基础概念 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块&#xff0c;而模块包含类型&#xff0c;类型又包含成员。 反射则提供了封装程序集、模块和类型的对象。 您可以使用反射动态地创建类型…

Spring框架(七):Spring的Web配置应用

Spring的Web配置应用引子JavaWeb的三大组件模拟Spring的web开发组件spring-webSpring的web开发组件spring-web引子 痛定思痛&#xff0c;主要问题出现在自己雀氏不熟悉框架底层、一些面试题&#xff0c;以及sql的一些情况淡忘了。 本章节的开始是对于过去的重新回顾&#xff0…

MFC绘制二维图形【1】—— 使用映射模式函数自定义坐标系

目录 一、创建Test工程 二、自定义坐标系 三、映射模式&#xff08;MapMode&#xff09; 四、映射模式函数 1&#xff09;设置映射模式函数 2&#xff09;设置窗口范围函数 3)设置视区范围函数 4&#xff09;设置视区原点函数 5&#xff09;偏移矩形函数 五、 不改变…

MyTinySTL学习笔记:迭代器iterator(一)

前言 本系列文章所学习的Github上基于C11的开源项目MyTinySTL&#xff0c;项目地址为:&#xff08;https://github.com/Alinshans/MyTinySTL&#xff09;&#xff0c;感谢Alinshans大佬开源这个优质的学习项目。 一、什么是迭代器 无论是序列容器还是关联容器&#xff0c;最…

useWindowPrint 自定义的打印HOOK

useWindowPrint 自定义的打印HOOK 1 介绍 useWindowPrint 用于实现页面的打印&#xff0c;打印的效果相对来说比较好。useWindowPrint 支持 onBeforePrint、onBeforePrintContent、onAfterPrint 等回调&#xff0c;可以很方便地在不同阶段进行操作&#xff0c;如果觉得使用回…

基于PHP+MySQL蛋糕甜点销售网站的设计与开发

现如今先进科学技术高速发展&#xff0c;计算机技术已经被社会的各个领域广泛应用。随着计算机技术和通信技术的迅猛发展&#xff0c;互联网的规模也逐步增大&#xff0c;互联网的元素也随之逐渐增加&#xff0c;可以利用其发展通信&#xff0c;也可以利用其进行商业用途&#…