离散化的应用:
因为最近在刷并查集和树状数组的题,发现在并查集和树状数组中的使用过程中,用离散化尽行优化用的必较广泛。离散化用来解决数据范围太大,无法开辟足够大的数组与之对应的情况。 以并查集为例:因为我们要为每一个元素开辟一个内存用来存储它的父亲节点,为了便于找到这个元素的父亲节点,我们要用元素的本身的值作为其父亲节点 的下标,这样就有一个弊端,即元素本身的数值很大的时候,我们开不了这么大的数组。举个例子:当一个数的值为1e9的时候,父亲节点的存储位置在parent[1e9]中,我们开不了这么大的数组,所以我们要将大范围的数投射到一个小范围内。这样就会节省很多空间。
种类并查集
种类并查集是并查集的扩展,在我现有的任何书上都没有关于种类并查集的讲解。我也是这周第一次遇到。可以说是在做题的过程中新学到的知识。也可以说是并查集的进阶用法了。
情况一:
并查集能维护连通性、传递性,通俗地说,亲戚的亲戚是亲戚。
然而当我们需要维护一些对立关系,比如 敌人的敌人是朋友 时,正常的并查集就很难满足我们的需求。
这时,种类并查集就诞生了。
常见的做法是将原并查集扩大一倍规模,并划分为两个种类。
在同个种类的并查集中合并,和原始的并查集没什么区别,仍然表达他们是朋友这个含义。
考虑在不同种类的并查集中合并的意义,其实就表达 他们是敌人 这个含义了。
按照并查集美妙的 传递性,我们就能具体知道某两个元素到底是 敌人 还是 朋友 了。洛谷1525 关押罪犯