树
acmer_zp
这个作者很懒,什么都没留下…
展开
-
最近公共祖先(在线查询)
和上一篇博客是同一题#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;//#pragma comment(linker, "/STACK:102400000,102400000") //不需要申请系统栈const int N = 400010;const i原创 2017-04-15 15:51:27 · 4438 阅读 · 0 评论 -
最近公共祖先(离线)
题目链接 题意:给你一棵树,后面是前面的父节点,k次查询,如果a是b的祖先输出1,b是a的祖先输出2,否则输出0; 思路:根据最近公共祖先判断得出结果;/**LCA(离线算法)主函数除建边外还应调用init();dir[1]=0;tarjan(1);*/#include <stdio.h>#include <string.h>#include <iostream>#inclu原创 2017-04-15 14:30:10 · 501 阅读 · 0 评论 -
值域线段树
题目链接 题目可转化为值域线段树的写法,题目上说让求所有区间和的值在L到R之间的有多少个,每一个区间值可以由数组的前缀和快速求出来,设sum[i]为i之前的和,i小于j即求sum[j]-sum[i]在L到R之间的有多少个,可以转化为 sum[j]-R<=sum[i]<=sum[j]-L,用sum[i]建一颗值域线段树每次询问在sum[j]-R到sum[j]-L之间的值有多少个累加起来就是结果。/原创 2017-07-11 18:42:39 · 1098 阅读 · 0 评论 -
静态主席树
POJ - 2104 主席树和值域线段树存的值都是一样的,但是主席树是n棵线段树,第i棵线段树存储的是i和i之前的所有信息(和前缀和类似),所以在求有关区间L~R的时候就可以用第R棵线段树减去第L-1棵线段树对应节点的值就得到了L~R之间的线段树。 类似值域线段树,没次插入一个数的时候最多修改一条树链,所以我们在给每个节点都建议可线段树的时候,它和前一棵线段树的差别也只有一条链,所以当我们在建第原创 2017-07-13 15:27:35 · 313 阅读 · 0 评论 -
动态主席树
ZOJ 2112 题目大意:给n个数,有m个操作。修改某个数,或者询问一段区间的第k小值。 动态主席树的意思就是原来的数组已经建好主席树了,然后又要修改数组中的某个值,然后还有许多查询,当然不止一次修改。 如果我们每次都建立主席树的话假如有n个数m次修改就是n*m的时间复杂度,这在n,m很大的时候就不行了,于是我们就新引进树状数组来存数组的变化值,当每次查询的时候只要将原来主席树里的值算出来,原创 2017-07-17 10:16:31 · 786 阅读 · 0 评论 -
伸展树(Splay)
codevs 4655序列终结者 Splay树是一个优化过的二叉搜索树,所以它满足二叉搜索树的性质,二叉搜索树有可能退化为一条链,n^2的时间复杂度,而Splay经过一系列的旋转操作使其平均复杂度控制在log(2)n但是常数比较大,因为要进行一系列的旋转操作。/*因为Splay_tree满足排序二叉树的性质,所以当查询或者修改某一个[L,R]区间的时候,就可以将L旋转到跟的位置,将R旋转到根的原创 2017-07-22 10:23:52 · 342 阅读 · 0 评论 -
Treap
POJ - 3481 警告:千万不要初始化种子,这oj会RE被坑了一天QAQ。 Treap就是一个用随机数优化了的二叉搜索树,二叉搜索树满足某个节点的值大于等于左儿子节点的值,小于右儿子节点的值,但是这样插入的值就会有可能形成一条链造成很低的效率,所以采用了用随机数优化的方法,随机的给每一个节点赋予一个优先级,在插入节点时,节点的优先级满足堆的性质(小顶堆或大顶堆),值满足二叉搜索树的性质,这就原创 2017-07-19 17:35:49 · 244 阅读 · 0 评论 -
树链剖分
题目链接 题意:给定一颗树,树上每一个节点都有一个权值,然后有q次查询, I a b c a节点和b节点之间的路径上的点的权值加上c D a b c a节点和b节点之间的路径上的点的权值减上c Q a 查询a节点的权值。 树链剖分是将树按照重链分成许多链,变成一个线性结构,这样就可以直接用线段树等数据结构处理了,每两个点之间链原创 2017-09-08 16:01:04 · 254 阅读 · 0 评论 -
树的点分治
poj 1741 题意:给定n个点的一棵树,还有一个k值,问树上任意两节点之间距离小于等于k的有多少对。 思路:先将无根树转化为有根树,可以统计出来每个点到达根的距离,然后就可以将所有的节点深度排序,可以O(n)计算出满足题意的有多少种。 但是这样包含在同一棵子树中的两个节点的贡献值,而且还漏掉了在同一颗子树的两个节点的贡献,因为这样算的是通过根的距离,所以我们就可以将所有的情况都计算出来,然原创 2017-09-27 20:36:16 · 248 阅读 · 0 评论