• 数据结构小结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

  • 相关阅读:
    JAVA线程池管理及分布式HADOOP调度框架搭建
    技术人员如何创业《二》 合伙人的模式
    JavaScript中的运动数学函数(持续更新)
    JavaScript中的加号
    JavaScript 函数绑定 Function.prototype.bind
    基于C#的波形显示控件的实现[附完整源码下载]
    JavaScript中的声明提升
    JavaScript & HTML5 Canvas 概览 更新时间201404111805
    《编写高质量代码——Web前端开发修炼之道》读后随笔
    B树/B+树/二叉搜索树/AVL树/红黑树
  • 原文地址:https://www.cnblogs.com/lnu161403214/p/9474126.html
Copyright © 2020-2023  润新知