离散化⚓︎
思路⚓︎
一串有序序列的值域很大( \(10^9\) ),但个数相对较少( \(10^5\) ),要求将自数组的下标映射到从0开始的依次标号。如:
\[
a\left[ \cdots \right] : \begin{cases}
1\rightarrow 0\\
100\rightarrow 1\\
2000\rightarrow 2\\
50000\rightarrow 3\\
\end{cases}
\]
离散化的本质,是映射,将间隔很大的点,映射到相邻的数组元素中。减少对空间的需求,也减少计算量。也就是把无限空间中有限的个体映射到有限的空间中去。
注意:
- 数组是有序数组,要先
sort
a[]
中可能有重复元素,所以要去重:使用库函数unique
,将数组元素去重并返回去重后数组的尾端点,再erase
- 如何算出
a[i]
(保序)离散化后的值是多少:二分
模板⚓︎
alls.erase(unique(alls.begin(), alls.end()), alls.end());
代码解析:
erase(pos, n);
删除从pos
开始的n
个字符,例如erase(0, 1)
, 删除0
位置的一个字符,即删除第一个字符erase(position)
; 删除position
处的一个字符(position
是个string
类型的迭代器)erase(first,last);
删除从first
到last
之间的字符,(first
和last
都是迭代器),last
不能是x.end()
unique
使用必须要先过一遍sort
排序。unique
函数返的返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。所以如果想要得到不重复元素的个数就需要用返回值减去开始地址
注:unique()
函数的大致实现思路:双指针算法
所有不同元素(排序后)必满足如下性质:它是第一个;它和前面元素不一样(a[i] != a[i - 1]
)
例题:区间和