标签:区间查询 遇到 过程 事件 方式 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
标签:区间查询 遇到 过程 事件 方式 zoj 维度 数组 竞赛
原文地址:https://www.cnblogs.com/lnu161403214/p/9474126.html