离散化常常用于空间很大,但实际使用的空间却很小的清空,假设开了一个arr[100010]的数组,但实际用到的只有10000个,这时候就可以使用离散化了。

离散化模板:
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;
if (alls[mid] >= x) r = mid;
else l = mid + 1;
}
return r + 1; // 映射到1, 2, ...n
}
unique函数是将数组中相邻的重复元素去除。然而其本质是将重复的元素移动到数组的末尾,最后再将迭代器末尾指向第一个重复元素的下标。比如原数组为 1 1 2 2 3 4 5 5 6 6,经过unique之后,则会得到1 2 3 4 5 6相同的元素就会被放在6后面,且unique函数返回的是6的地址所以通过erase函数,从6到alls.end( )之间的数字全删掉

本文介绍了如何在大空间离散化问题中,通过排序、去重并实现二分查找,处理区间增加和查询的操作。通过一个具体实例演示了如何使用离散化技术来高效地求解区间范围内的前缀和问题。
612

被折叠的 条评论
为什么被折叠?



