第十周总结----并查集,树状数组

离散化的应用:

因为最近在刷并查集和树状数组的题,发现在并查集和树状数组中的使用过程中,用离散化尽行优化用的必较广泛。离散化用来解决数据范围太大,无法开辟足够大的数组与之对应的情况。 以并查集为例:因为我们要为每一个元素开辟一个内存用来存储它的父亲节点,为了便于找到这个元素的父亲节点,我们要用元素的本身的值作为其父亲节点 的下标,这样就有一个弊端,即元素本身的数值很大的时候,我们开不了这么大的数组。举个例子:当一个数的值为1e9的时候,父亲节点的存储位置在parent[1e9]中,我们开不了这么大的数组,所以我们要将大范围的数投射到一个小范围内。这样就会节省很多空间。

种类并查集

种类并查集是并查集的扩展,在我现有的任何书上都没有关于种类并查集的讲解。我也是这周第一次遇到。可以说是在做题的过程中新学到的知识。也可以说是并查集的进阶用法了。
情况一:
并查集能维护连通性、传递性,通俗地说,亲戚的亲戚是亲戚。
然而当我们需要维护一些对立关系,比如 敌人的敌人是朋友 时,正常的并查集就很难满足我们的需求。
这时,种类并查集就诞生了。
常见的做法是将原并查集扩大一倍规模,并划分为两个种类。
在同个种类的并查集中合并,和原始的并查集没什么区别,仍然表达他们是朋友这个含义。
考虑在不同种类的并查集中合并的意义,其实就表达 他们是敌人 这个含义了。
按照并查集美妙的 传递性,我们就能具体知道某两个元素到底是 敌人 还是 朋友 了。洛谷1525 关押罪犯
P5937 Parity Game
情况二:
与情况一类似但是更复杂了一点我们要维持三个关系以洛谷P2024食物链为例(我觉得带着例子更好解释一点),A吃B,B吃C,C吃A,这样的三重关系比“朋友的敌人是朋友“这样的二重关系还要多一重关系。但是还是换汤不换药,我们依然按照二重关系的做法解决就可以。具体的过程我有点理解不来,但是基本的算法熟练运用已经没有问题了。只要是搞明白二重关系和三重关系的并查集,我觉得再多重关系的并查集依旧可以采用这个思路去解决。

并查集结合DP

其实并查集可以结合很多算法,比如并查集结合背包问题P2170 选学霸
做了几个题之后发现并查集很多时候都会结合着其他算法出题,最终要想在别的题里能看出并运用并查集,还是要对并查集的本质真正理解:并查集即分组

树状数组

最基本的用法应该是单点修改求前缀和,这很简单。不用多说,除了模板题至今还没有遇见这么直接问的。但在实际做题的过程中有很多扩展,很多时候是结合离散化和排序在使用。额。。。想不出来怎么描述这一种用法。结合例题吧:P1168中位数
P1637 三元上升子序列
P2345 [USACO04OPEN]MooFest G
题型不同但是思想相同。

本周解决的题目(划去的是上周做的)

第十周总结----并查集,树状数组_第1张图片
第十周总结----并查集,树状数组_第2张图片
在这里插入图片描述

你可能感兴趣的:(周总结)