注意:这里的离散化指的是整数有序的离散化
但离散化到底是个什么东西呢?
假设有一个值域很大(如$0 \le x \le 10^9$)但数量很少(如$0 < n \le 10^5$)的数列$a$。
而这道题需要用数列的值做下标,数组根本存不下,怎么办。
可以用离散化的方法,把每个值映射成从0开始的连续的自然数。
这个过程就叫做离散化。
离散化的过程中有两个问题。
- $a$中有可能有重复元素,这样就需要去重。
- 如何算出$x$离散化之后的值,可以用二分。
终于又有模板了:
vector<int> alls; // 存储所有待离散化的值
输入...
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素
问题二的做法:
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; // 加一是从1开始映射,不加一是从0开始
}