zoukankan      html  css  js  c++  java
  • 数据结构小结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

  • 相关阅读:
    RabbitMq 集群配置
    获取 input 单选框和多选框的值
    js 获取 通过 ”?“ 或者 ”&“ url 传过来参数值
    Java 对文件的读取操作
    java 链接jdbc
    了解EBP寄存器
    节后后遗症
    [转]web service实现原理与异步调用
    Javascript实现无刷新分页
    邮件发送
  • 原文地址:https://www.cnblogs.com/lnu161403214/p/9474126.html
Copyright © 2011-2022 走看看