这是一个LCA 树上倍增 求法的 Blog , 差不多就是一个算法模板
1 | void bfs() { |
这是一个LCA的模板, LCA的应用需要进行初始化, 总的时间复杂度大概在O(nlogn) + O(logn) 的范围左右。
关于LCA的应用, 可以求一棵树上两点之间的最短距离 , 模板如下所示:
1 | void bfs() { |
ans 中所存的值即为所求的答案。
AFO | 前xx一中oier,机房最菜
这是一个LCA 树上倍增 求法的 Blog , 差不多就是一个算法模板
1 | void bfs() { |
这是一个LCA的模板, LCA的应用需要进行初始化, 总的时间复杂度大概在O(nlogn) + O(logn) 的范围左右。
关于LCA的应用, 可以求一棵树上两点之间的最短距离 , 模板如下所示:
1 | void bfs() { |
ans 中所存的值即为所求的答案。
线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。是一种可以进行寻找信息统计,支持查询和修改的一种高级数据结构.
有关于线段树的知识, 之前就计划进行一个线段树的知识总结, 现在抽时间进行一下总结:
像之前一样, 还是先总结一下线段树具有的一些性质:
线段树中各节点的表示方法:
这样我们就可以简单的用一个struct数组来保存一颗线段树. 当然, 这颗线段树的最后一层可能并不是连续的, 并没有填满. 最后一层产生了空余, 所以保存线段树的数组长度要不小于 4 倍的 N才能保证不会越界.
树形结构是图论中的一种特殊情况, 可以说树就是一种特殊的图结构. 树的定义是这样的, 如果一个图中一共有n个顶点, 并且有且只有n-1条边, 这样的图被称之为树.
根据树的性质, 我们可以得出几个简单的结论:
根据树的一些性质我们可以求一些树的基本特征:
下面是这些特征的定义:
以上的这些性质基本上都可以用搜索, 或者DP的方法来求出,现在总结一下这些基本特征的代码,来加强一下记忆
1 | inline int Mul(int a,int b,int p,int res=0){for(;b;b>>=1,a=(a+a)%p)if(b&1)res=(res+a)%p;return res;}// 其实是伪的快速乘,并没有提高速度,只是防止了溢出。 记得res的值初始化为0。 |
代码很简洁只用两行就好
1 | inline int add(int a,int b){return (a+=b) > mod?a-mod:a;} |
这样可以保证每次加减乘运算的结果在0 ~ mod 的范围之内,优化常数。