数据结构小结1

1,并查集

》并与查操作

》“边带权”并查集

  以d[x]保存节点x到父节点的fa[x]的边权,这个边权一般也看作x与fa[x]关系的抽象,它也是和正常的边权一样,可以相加的,也就是说x节点与根节点的边权(关系)即其路径的边权和。

》“扩展域”并查集

  对于每一对,枚举可能发生的情况,将同时发生的事件并在一起,两个互斥的事件同时发生,便可判断产生了矛盾。

  习题:poj1182,poj1733(前缀和),poj2912,poj1417(背包)

2,树状数组

  这个数组的逻辑结构是一颗树,所以叫树状数组。

》单点修改与区间查询

》单点查询与区间修改(前缀和、差分)

》区间修改与区间查询(前缀和、差分、转化 / 百度)

》快速查询01序列的第k个1

  习题:逆序对,poj2182,poj2828

3,分治

》树上点分治

poj1741

这个算法的一般过程:

step1:选取树的重心p作为根节点

step2:从p出发进行一次dfs,求出需要的信息(如deep[x])

step3:执行Calc(p)

step4:删除根节点p,对p的每棵子树递归执行step1-4

原理:如果将路径以树根划分,那么就只有经过根的和不经过根的(在子树中)的路径两种,那么:先统计经过根节点的路径数目,再删除根节点,子树递归统计。

复杂度:O(Nlog2N)

》cdq分治

这个是一种按顺序的分治,就比如说acm竞赛经常遇到对一个序列进行区间操作的问题,一个查询受到来自查询前的操作的影响,我们可以把操作序列看成一个区间,以分治的方式将前面操作的影响累加起来,例如操作序列【L,R】,先递归处理[l,mid],[mid+1,r],然后再来考虑整个区间,处理[l,mid]里的修改等操作对[mid+1,r]的查询的影响就可以了。

如果解决的问题与顺序无关,或者并不能在可接受的复杂度内处理前半区间对后半区间的影响,那cdq也没啥用。

ps:在一些问题上用来降低维度很好,且不需要空间,比树套树好多了

习题:陌上花开,bzoj2716,bzoj1176

猜你喜欢

转载自www.cnblogs.com/lnu161403214/p/9474126.html
今日推荐