码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构小结1

时间:2018-08-14 22:49:42      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:区间查询   遇到   过程   事件   方式   zoj   维度   数组   竞赛   

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

数据结构小结1

标签:区间查询   遇到   过程   事件   方式   zoj   维度   数组   竞赛   

原文地址:https://www.cnblogs.com/lnu161403214/p/9474126.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!