引入

离散化,就是把一些很离散的点给重新分配。

举个例子,如果一个坐标轴很长(>1e10),给你1e4个坐标,询问某一个点,坐标比它小的点有多少。

很容易就知道,对于1e4个点,我们不必把他们在坐标轴上的位置都表示出来,因为我们比较有多少比它小的话,只需要知道他们之间的相对大小就可以,而不是绝对大小,这,就需要离散化。

而离散化又分为两种,分为的两种是对于重复元素来划分的。第一种是重复元素离散化后的数字相同,第二种就是不同。

第一种

其实就是用一个辅助的数组把你要离散的所有数据存下来。

然后排序,排序是为了后面的二分。

去重,因为我们要保证相同的元素离散化后数字相同。

再用二分把离散化后的数字放回原数组。

代码如下。

#include<algorithm> // 头文件
//n 原数组大小 num 原数组中的元素 lsh 离散化的数组 cnt 离散化后的数组大小
int lsh[MAXN] , cnt , num[MAXN] , n;
for(int i=1; i<=n; i++) {scanf("%d",&num[i]);lsh[i] = num[i];
}
sort(lsh+1 , lsh+n+1);
cnt = unique(lsh+1 , lsh+n+1) - lsh - 1;
for(int i=1; i<=n; i++)num[i] = lower_bound(lsh+1 , lsh+cnt+1 , num[i]) - lsh;

注意事项:

1.去重并不是把数组中的元素删去,而是重复的部分元素在数组末尾,去重之后数组的大小要减一

2.二分的时候,注意二分的区间范围,一定是离散化后的区间

3.如果需要多个数组同时离散化,那就把这些数组中的数都用数组存下来

第二种

第二种方式其实就是排序之后,枚举着放回原数组

用一个结构体存下原数和位置,按照原数排序

我结构体里面写了个重载,也可以写一个比较函数

最后离散化后数在 r a n k [ ] rank[] rank[]里面

#include<algorithm>
struct Node {int data , id;bool operator < (const Node &a) const {return data < a.data;}
};
Node num[MAXN];
int rank[MAXN] , n;
for(int i=1; i<=n; i++) {scanf("%d",&num[i].data);num[i].id = i;
}
sort(num+1 , num+n+1);
for(int i=1; i<=n; i++)rank[num[i].id] = i;

总结

先送一道有离散化的题:Luogu1955

很水的一道题,解析在这:NOI2015程序自动分析

用的最多的是第一种方法,第二种方法感觉比较陌生,不过还是需要学的。

有不对的地方欢迎更正,只要看见一定采纳。

离散化:两种离散化方式详解相关推荐

  1. PCBA加工中常见的两种焊接方式详解

    PCBA加工中常见的两种焊接方式详解 PCBA加工,两种常见的焊接方式就是回流焊和波峰焊,与手动焊接技术相比,自动焊接技术具有减少人为因素的影响.提高效率.降低成本.提高质量等优势,在PCBA加工中, ...

  2. redis的两种持久化方式详解

    一.背景 在实际开发中,为了保证数据的完整性,防止数据丢失,我们除了在原有的传统数据库保存数据的同时,最好是再用redis持久化再保存一次数据.如果仅仅是使用redis而不进行持久化配置的话,当red ...

  3. oracle mysql连接池配置文件_数据库连接池两种配置方式详解

    数据库连接池: 负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接 ...

  4. 字典树(Trie树)两种实现方式详解

    目录 字典树介绍 字典树二维数组实现 实现思路 代码实现 字典树节点链表实现 实现思路 代码实现 字典树介绍 字典树,又称单词查找树. 其根节点不包含字符,除根节点外每一个节点都只包含一个字符: 从根 ...

  5. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  6. linux apache两种工作模式详解

    apache两种工作模式详解 刚接触这两个配置时很迷糊,全部开启或全部注释没有几多变化.今天搜索到这么一篇讲得还不错的文章,看了几篇,还是不能完全记住,做一个收藏. 空闲子进程:是指没有正在处理请求的 ...

  7. @Resource,@Autowired,@Inject3种注入方式详解

    转载自 @Resource,@Autowired,@Inject3种注入方式详解 概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中. ...

  8. python类的命名空间_Python之关于类变量的两种赋值区别详解

    我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = ...

  9. oracle数据库按日期查询,关于Oracle数据库日期范围查询的两种实现方法详解,oracle详解...

    关于Oracle数据库日期范围查询的两种实现方法详解,oracle详解 Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,接下来我们通过一个实例来介绍这一过程.我们假设 ...

  10. C++的三种继承方式详解

    文章目录 @[toc] C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 ...

最新文章

  1. 浮点卷积winograd算法
  2. hbase的HA模式配置和维护
  3. ASP.NET Core使用Nacos SDK访问阿里云ACM
  4. 分布式数据流计算系统的数据缓存技术综述
  5. linux中磁盘的iused,Linux 磁盘与文件系统管理
  6. Javascript学习总结 - JS基础系列三
  7. 获取虚拟账号列表失败啥意思_「图」Windows 10 Build 18963发布:可显GPU温度 支持重命名虚拟桌面...
  8. java.lang.IllegalArgumentException: name MUST NOT NULL! at org.nutz.dao.impl.NutDao.fetch
  9. WINDOWS如何编写注册表文件
  10. 数据分析这么做,销售看了拍手叫好
  11. HTML5从入门到精通
  12. 小宝机器人怎么开机_小宝机器人用户手册.PDF
  13. 针对高通BMS的研究 高通电量计
  14. 面试你对计算机未来三年内规划,2019农商银行面试:谈谈你未来3年的规划
  15. pyinstaller编译报错 IsADirectoryError: [Errno 21] Is a directory
  16. 2.灰尘对计算机的影响,灰尘对电脑有影响不?
  17. android系统定制教程,Android系统DIY修改 定制第三方ROM教程
  18. win10连无线但是无网络连接到服务器,简单几步解决win10连接wifi显示无internet访问的问题...
  19. 凸包——Graham-Scan算法
  20. 一日一技:用Python绘画有多好玩

热门文章

  1. eclipse因jdk打不开解决
  2. 数据同步利器之Tapdata Cloud
  3. 分布式技术高频面试考点梳理
  4. Ubuntu16.04安装Redshift色温调节工具
  5. C语言中的指数函数pow()问题
  6. n9006 android6,超详细三星Note3(N9006)ROOT教程
  7. 测试工程师需要掌握哪些软技能?
  8. 实现Taro 项目拆分到多个分包(Taro和原生混合开发)
  9. CC2640R2F BLE5.0 CC2640R2BLE5.0开发文档
  10. 如何将EndNote中的参考文献插入到word中