离散化笔记

文章目录

  • 离散化的适用条件
  • 离散化的意思
  • AcWing 802. 区间和
    • CODE
    • CODE2



离散化的适用条件

  • 离散化用于区间求和问题
  • 对于数域极大,而数的量很少的情况下

离散化的意思

  • 背景:对于一个极大数域上的零星几个数进行操作后,求某段区间内的和
    • 其实意思就是大数域映射到一个小数域内。比如我的操作是:第 30 30 30 位加 10 10 10,第 2000 2000 2000 位加 50 50 50,第 1 0 6 10^6 106 位加 100 100 100,映射后我的操作就是a[1] += 10a[2] += 50a[3] += 100,也就是说,我们将零散的数域变得紧凑。

    • 我们如何做到将序列号变紧密而且不重复呢?

      • 首先,我们将需要转化的序列号存在一个数组a[]内,序列号就是我们在大数域内进行操作时的序列号(操作包括对某一号元素进行改值,或者是求区间之和的时候区间的左右端点。这些都是大数域上的序列号)
      • 之后,我们将这些序列号进行排序,然后去掉重复的号。
        • 这步操作的意思是,每个大数域上的序列号在小数域上只能有一个编号与其对应,所以需要去除重复的大序列号
      • 我们用数组a[]的下标作为小数域上与大数域相对应的编号
      • 所以说我们其实是通过一个数组来将序列号缩小的
    • 最后我们使用前缀和算法快速求得多个询问的区间和即可


AcWing 802. 区间和

题目链接:AcWing 802. 区间和

区间和

CODE

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;typedef pair<int, int> pii; 	 // 定义一个pair类型的别名PII,用于存储一对整数int n, m; 	 // n和 m 分别表示插入操作和查询操作的数量
const int N = 300010; 	// 定义一个常量N,作为数组的大小
int a[N], s[N]; 	 	// a数组用于存储每个位置的数值,s数组用于存储前缀和vector<int> alls; 	 		// alls向量用于存储所有出现过的数
vector<pii> add, query;		// add向量用于存储所有的插入操作,query向量用于存储所有的查询操作int l, r;  	// l和r用于存储查询操作的左右边界
int x, c;  	// x和c用于存储插入操作的数和次数int find(int x) 	 // find函数用于在alls向量中找到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;  	// 输入插入操作和查询操作的数量while (n -- ){cin >> x >> c;add.push_back({x, c});alls.push_back(x); 	 // 将x加入到alls向量中}while (m -- ){cin >> l >> r;query.push_back({l, r});alls.push_back(l);  	// 将l和r加入到alls向量中alls.push_back(r);}// 去重sort(alls.begin(), alls.end());  	// 对alls向量进行排序alls.erase(unique(alls.begin(), alls.end()), alls.end());  // 删除alls向量中的重复元素// 找加入元素的位置并初始化加入数组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){l = find(item.first), r = find(item.second);printf("%d\n", s[r] - s[l - 1]);}
}
  • 其实由上述过程和代码我们可以发现,我们用数组来缩小数域的思路与哈希表不谋而合,所以说我们可以用哈希表来存我们的操作数的序列号,这样的话能将二分的 O ( l o g n ) O(logn) O(logn) 优化到哈希表的 O ( 1 ) O(1) O(1)

  • 但是我们不能用手写的简易哈希表(单指开放寻址和拉链法,能优化成map当我没说)
    因为开放寻址法中,我们需要对对所有数进行取模操作,而模量N是较小的,而数据的编号很大,所以就可能出现我们映射的范围出现问题,例如一个区间[l, r],我们用的模量N满足: l < N < r l < N < r l<N<r,这个时候我们有个尴尬的问题,我们的l映射之后比r大,那么再对这个区间求和时就回出现错误

  • 这个时候就需要我们伟大的 S T L STL STL 出场了,unordered_map很好的解决了我们的问题
    map的实现

    map
    不得不说,C++真的很牛逼啊,那老头真吊

CODE2

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;typedef pair<int, int> pii;int n, m;
const int N = 300010;
int a[N], s[N];
vector<int> alls;
vector<pii> add, query;
int l, r;
int x, c;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;while (n -- ){cin >> x >> c;add.push_back({x, c});alls.push_back(x);}while (m -- ){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());unordered_map<int, int> indx;for(int i = 1; i <= alls.size(); ++i) indx[alls[i - 1]] = i;// 找加入元素的位置并初始化加入数组for(auto item : add){int x = indx[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){l = indx[item.first], r = indx[item.second];printf("%d\n", s[r] - s[l - 1]);}
}

这个代码是我从评论区抄的,位置:https://www.acwing.com/solution/content/13511/,往下翻评论区有个哈希表代码

但是我怎么都看不懂他哈希表的赋值操作

for(int i = 1; i <= alls.size(); ++i) indx[alls[i - 1]] = i;

艹!!!!!!!!!为什么!!!!!!!!!
问bing,他跟我说因为是我在之前对alls[]数组排序去重了,所以区间[l, r]肯定不会映射出错,r映射完肯定比l大,但是我问他是因为键有序所以导致哈希表映射后相对顺序不变吗,它又说不是,然后就是一堆我看不懂的谜语,一直复读复读复读,啊啊啊啊啊啊啊好痛苦啊啊啊啊啊啊

我把对键的赋值改了,不赋为i,但是又 W A WA WA,真的很烦啊,想不出来为什么,等我以后深入一下 S T L STL STL 再说吧 <_>,蒟蒻是这样的。

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

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

相关文章

JSch线上出现com.jcraft.jsch.JSchException: channel is not opened.问题分析

JSch线上出现com.jcraft.jsch.JSchException: channel is not opened.问题分析 文章目录 JSch线上出现com.jcraft.jsch.JSchException: channel is not opened.问题分析1. 背景1.系统使用jsch这个框架做文件发送以及远程命令执行的操作,系统一直运行正常,直到某一个环境发现 2.…

关于我司在上海物联网行业协会展厅展示项目案例

1 项目背景 上海市物联网行业协会&#xff08;SIOT&#xff09;是由本市物联网行业同业企业及其他相关经济组织自愿组成、实行行业服务和自律管理的非营利性社会团体法人&#xff0c;于2012年&#xff0c;经上海市经济和信息化委同意&#xff0c;在上海市社团局登记成立。 本…

pat模拟题—7-11 两个序列的中位数

一个长度为n(n⩾1)的升序序列S,处在第2n​个位置的数称为序列S的中位数(median number),例如&#xff0c;序列S1{10,13,14,16,18,19}的中位数是14。两个序列的中位数是它们所有元素的升序序列的中位数&#xff0c;例如&#xff0c;S2{2,4,8,9,20,21},则S1和S2的中位数是13。现有…

vue3中 watch、watchEffect区别

watch是惰性执行&#xff0c;也就是只有监听的值发生变化的时候才会执行&#xff0c;但是watchEffect不同&#xff0c;每次代码加载watchEffect都会执行&#xff08;忽略watch第三个参数的配置&#xff0c;如果修改配置项也可以实现立即执行&#xff09;watch需要传递监听的对象…

【精选】Spring整合MyBatis,Junit 及Spring 事务Spring AOP面向切面详解

Spring整合MyBatis 搭建环境 我们知道使用MyBatis时需要写大量创建SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等对象的代码&#xff0c;而Spring的作用是帮助我们创建和管理对象&#xff0c;所以我们可以使用Spring整合MyBatis&#xff0c;简化MyBatis开发。 …

SDK emulator directory is missing

要进行uniapp真机测试&#xff0c;不得不安装配置一下安卓开发环境 &#xff0c;搞一个模拟器。。。然后又是各种坑。。对比来对比去还是IOS的环境使用着舒服&#xff0c;XCODE下载好&#xff0c;一切重点就是在编码了。。 安卓这个脑残货呀&#xff0c;哎&#xff0c;各种安装…

记录 | rm -rf 删除除了指定文件以外的文件,以及在Bash脚本中的使用方法

一般 rm -rf 的用法是&#xff1a; # 删除当前目录所有文件 rm -rf ./*但要是想删除当前目录除了 aa.txt以外的其他所有文件呢&#xff0c;该怎么办呢&#xff1f; 命令如下&#xff1a; rm -rf !(aa.txt)然而这个时候可能会报错&#xff1a; bash: !: event not found 这是因…

rust 基本数据类型

Rust 是 静态类型&#xff08;statically typed&#xff09;语言&#xff0c;也就是说在编译时就必须知道所有变量的类型&#xff0c;基本类型如下 整型 整数 是一个没有小数部分的数字长度有符号无符号8-biti8u816-biti16u1632-biti32u3264-biti64u64128-biti128u128archisi…

【开题报告】基于SSM的高端茶具选购系统的设计与实现

1.选题背景 近年来&#xff0c;随着人们生活水平的提高以及对健康生活的追求&#xff0c;茶文化逐渐在人们的生活中占据了重要地位。茶具作为茶文化的重要组成部分&#xff0c;对于制茶、品茶都有着至关重要的影响。因此&#xff0c;如何选购合适的高端茶具成为了越来越多茶友…

数据挖掘之时间序列分析

一、 概念 时间序列&#xff08;Time Series&#xff09; 时间序列是指同一统计指标的数值按其发生的时间先后顺序排列而成的数列&#xff08;是均匀时间间隔上的观测值序列&#xff09;。 时间序列分析的主要目的是根据已有的历史数据对未来进行预测。 时间序列分析主要包…

whatsapp信息群发脚本开发!

WhatsApp 作为全球广受欢迎的通讯应用&#xff0c;在我们的日常生活中扮演着重要角色&#xff0c;有时候&#xff0c;我们需要向大量联系人发送消息&#xff0c;比如营销推广、活动通知等。 一个个手动发送消息?那简直太落后了!今天&#xff0c;我们将探讨如何利用脚本开发实…

centos nginx安装及常用命令

nginx配置文件位置 nginx 安装有两种方式一种是联网一键下载&#xff0c;Nginx 配置文件在 /etc/nginx 目录下&#xff0c;一种是源码包可以无网下载&#xff0c;有两个配置文件启动地方一个是安装包存放位置&#xff0c;一是/usr/local/nginx/conf下&#xff0c;启动要看你…

MxL3706-AQ-R 2.0通道绑定同轴网络集成电路特性

MxL3706-AQ-R是Max线性公司的第三代MoCA2.0同轴网络控Z器SoC&#xff0c;可用于在现有的家庭同轴电缆上创建具有千兆位吞吐量性能的家庭网络。 该MxL3706-AQ-R工作在400MHz至1675MHz之间的无线电频率&#xff0c;并与satellite共存&#xff0c;电X和有线电视运营商的频率计划。…

前端:HTML鼠标样式及其对应的CSS属性值

1、默认箭头样式&#xff1a; selector {cursor: default; } 2、手型样式 selector {cursor: pointer; } 3、文本选择样式&#xff1a; selector {cursor: text; } 4、移动手型样式&#xff1a; selector {cursor: move; } 5、缩放手型样式&#xff1a; selector {cur…

Nginx 实现动静资源分离和负载均衡

1、相关概念 静态资源 .html .jpg .css .js等&#xff0c;没有后台数据库&#xff0c;不含程序&#xff08;如php、jsp、asp等&#xff09;的网页 动态资源 需要访问数据库的资源都属于动态资源 静态请求 用户发起的请求只访问到前端资源&#xff0c;不访问数据库 动态请求…

利用pytorch实现卷积形式的ResNet

利用pytorch实现卷积形式的ResNet 1. 导入必需的库2. 定义残差块3. 构建 ResNet 网络4. 实例化网络和训练 要使用 PyTorch 实现卷积形式的 ResNet&#xff08;残差网络&#xff09;&#xff0c;你需要遵循几个主要步骤。首先&#xff0c;让我们概述 ResNet 的基本结构。ResNet …

让 OpenAI GPT4 出 10 道题测试其他开源大语言模型

让 OpenAI GPT4 出 10 道题测试其他开源大语言模型 1. 中文题目及答案2. 日文题目及答案3. 英文题目及答案 1. 中文题目及答案 数学题&#xff1a;一个矩形的长是10厘米&#xff0c;宽是5厘米&#xff0c;求它的面积。 答案&#xff1a;面积 长 x 宽 10厘米 x 5厘米 50平方厘…

金属款超声波风速风向传感器的创新与科技力量

在当今的科技世界中&#xff0c;WX-WQX2S 金属款超声波风速风向传感器以其独特的功能和可靠的性能&#xff0c;引领着气象科技领域的新潮流。这款传感器利用超声波技术&#xff0c;对风速和风向进行高精度测量&#xff0c;为气象学家和环境监测机构提供了强大的工具。 一、金属…

基于STM32单片机的智能家居系统设计(论文+源码)

1.系统设计 基于STM32单片机的智能家居系统设计与实现的具体任务&#xff1a; &#xff08;1&#xff09;可以实现风扇、窗帘、空调、灯光的开关控制&#xff1b; &#xff08;2&#xff09;具有语音识别功能&#xff0c;可以通过语音控制家电&#xff1b; &#xff08;3&a…

图面试专题

一、概念 和二叉树的区别&#xff1a;图可能有环 常见概念 顶点&#xff08;Vertex&#xff09;&#xff1a; 图中的节点或点。边&#xff08;Edge&#xff09;&#xff1a; 顶点之间的连接线&#xff0c;描述节点之间的关系。有向图&#xff08;Directed Graph&#xff09;&…