ฅ(๑˙o˙๑)ฅ 大家好, 欢迎大家光临我的博客:面向阿尼亚学习
算法学习笔记系列持续更新中~


文章目录

  • 一、前言
  • 二、离散化算法的介绍
  • 三、离散化算法的运用
    • 运用情况
    • 使用STL算法离散化
    • 离散化模板
  • 最后

一、前言

离散化是程序设计中一个常用的技巧,它可以有效的降低时间复杂度。其基本思想就是在众多可能的情况中,只考虑需要用的值。离散化可以改进一个低效的算法,甚至实现根本不可能实现的算法。


二、离散化算法的介绍

离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。
离散化本质上可以看成是一种哈希

三、离散化算法的运用

运用情况

数的值域跨度范围很大,但数的个数很少,通常会差几个数量级

使用STL算法离散化

思路是:先排序,再删除重复元素,最后就是索引元素离散化后对应的值。
至于什么是STL以后会更新,希望持续关注~~

关于unique():

使用前需排序
所有不重复的元素排在数组的最前面,数组末尾未占用的位置保留原来的值返回值是不重复的元素个数(标准说法是去重之后的尾地址),即重复元素的第一位,便于erase对其进行删除

vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(), alls.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;// x在哪,区间就往哪里缩if (alls[mid] >= x) r = mid;else l = mid + 1;}return r + 1; // 映射到1, 2, ...n
}

因为数的下标范围过大(10^9),我们无法开辟一个如此大的数组。

为此,我们将数的下标存储成值,来进行计算

离散化模板

假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。
输入格式
第一行包含两个整数 n 和 m。
接下来 n 行,每行包含两个整数 x 和 c。
再接下来 m 行,每行包含两个整数 l 和 r。
输出格式
共 m 行,每行输出一个询问中所求的区间内数字和。
数据范围
−109≤x≤109,
1≤n,m≤105,
−109≤l≤r≤109,
−10000≤c≤10000
输入样例:
3 3
1 2
3 6
7 5
1 3
4 6
7 8
输出样例:
8
0
5

代码如下

#include <iostream>
#include <vector>
#include <algorithm>
#define x first
#define y secondusing namespace std;
typedef pair<int, int> PII;const int N = 300010;int n, m;
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 >> 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;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) {a[find(item.x)] += item.y;}// 求其前缀和,以便求任意区间for (int i = 1; i <= alls.size(); i++) s[i] = s[i-1] + a[i];// 处理问询结果for (auto t : query) {int l = find(t.x), r = find(t.y);cout << s[r] - s[l-1] << endl;}return 0;
}

最后

莫言真理无穷尽,寸进自有寸进欢

【算法基础——第八讲】离散化相关推荐

  1. java数据结构和算法 北风 下载_Java] 北风Java20集+44集版数据结构算法基础教程

    20集版本 第一讲数组.rar 第二讲简单排序.A危i 第三讲栈和队列.A危i 第四讲链表.A危i 第五讲双端链表和双向链表.A危i 第六讲递归的应用.A危i 第七讲递归的高级应用.A危i 第八讲希尔 ...

  2. 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索

    0基础学算法 搜索篇第一讲 深度优先搜索 相信绝大多数人对于深度优先搜索和广度优先搜索是不会特别陌生的,如果我这样说似乎你没听说过,那如果我说dfs和bfs呢?先不说是否学习过它们,至少它们的大名应该 ...

  3. AcWing基础算法课Level-2 第二讲 数据结构

    AcWing基础算法课Level-2 第二讲 数据结构 单链表 AcWing 826. 单链表3453人打卡 双链表 AcWing 827. 双链表2865人打卡 栈 AcWing 828. 模拟栈3 ...

  4. 活动作品计算机视觉课程第八讲-带你简单快速学习2021年春晚背后刘德华与背景分离切换到另一场景视觉算法(下集):OpenCV4感兴趣目标与背景融合

    计算机视觉课程第八讲-带你简单快速学习2021年春晚背后刘德华与背景分离切换到另一场景视觉算法(下集):OpenCV4感兴趣目标与背景融合 本专栏将会带大家学习 <计算机视觉与图形学> 相 ...

  5. 【算法基础】离散化 AcWing 802. 区间和 (详细)

    传送门 C++还没入门,代码看了十多遍 ,补了点语法,终于ac了!! 前言 欢迎关注我的专栏,准备写完算法基础所有题解

  6. 算法基础(ACWing)

    算法基础 基础算法 快速排序 快速排序,背一背板子. 一点心得: 快速排序不是稳定算法 快速排序时间复杂度O(nlogn),空间复杂度是O(longn)虽然没有开辟新的空间但是递归占用了栈空间. 主要 ...

  7. 【算法基础】常用的数据结构与算法

    学习了王争老师的数据结构与算法之美之后,比较有感触,他把我们常用的数据结构和算法都讲了一遍,而且讲的还不错.整理汇总一下作为笔记. 一.复杂度分析 非常重要.我们必须掌握,基本上要做到,简单代码能很快 ...

  8. 计算机网络如何配置ospf动态路由,《计算机网络高级配置》第八讲OSPF动态路由协议...

    <计算机网络高级配置>第八讲OSPF动态路由协议 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 2009年12月7日课题: ...

  9. 算法基础、算法比赛快速入门(java)

    想用Java快速入门算法?这篇文章你得看! 提示:本文章适合想要入门算法,并且想 "快速" 达到一定成果的同学们阅读~ 文章非常非常非常长(可能是你见过最长的算法基础篇章)!!! ...

最新文章

  1. react构建淘票票webapp,及react与vue的简单比较。
  2. 三十四、段页式管理方式
  3. zookeeper原理与使用
  4. 十四、去年写的Numpy使用方法梳理,2020年5月13日整理
  5. java调用ole ie_ActiveX (.ocx)的写法,及在IE里调用
  6. 微型计算机的主要硬件以及技术指标,微型计算机主要技术指标
  7. CentOS安装Oracle12C
  8. Bootstrap自适应居中问题
  9. php中sha1,PHP中sha1()函数和md5()函数的绕过
  10. Hadoop面向行和面向列格式详解
  11. 正则表达式及常用大全
  12. 性能可靠服务器虚拟化,服务器虚拟化分析
  13. android viewpager监听,viewPager的OnPageChangeListener监听器的方法调用顺序
  14. 【转】Myeclipse2017破解:成功解决me Trial expired 0 days ago mgeclipse It's now time to buy the best IDE for y
  15. DS18B20温度传感器
  16. 一个小巧好用的Url编解码工具
  17. 生成扩散模型漫谈:DDPM = 自回归式VAE
  18. 纵横杯2020 web wp
  19. it 软件测试 英文,测试英文怎么说
  20. Linux简单操作权限和相关工具

热门文章

  1. JS设计模式初探——单例模式
  2. 挤公交闲谈与虚析构函数精讲
  3. 星云服务器装系统,如何用一台电脑给多台电脑装系统
  4. SVN与Git优缺点比较(属面试常问提)
  5. 计算机应用基础第四版必考点,2018计算机应用基础考试知识点复习考点归纳总结...
  6. 解决 Windows10 安装 office 后新建 excel xlsx无法打开的问题
  7. 【jQuery】简单的网页文本格式编辑器ckeditor
  8. python 二重积分 辛普森法_二重积分的数值方法.doc
  9. Python爬虫实战(六):对某一关键词的某度指数数据的爬取(2022年5月更新)
  10. 良心安利SolidEdge 3d模型素材