[学习笔记] 点分治学习笔记
来源:互联网 发布:淘宝宜家代购是真的吗 编辑:程序博客网 时间:2024/05/17 06:58
点分治学习笔记
OI中有一类在树上与路径有关的题目。
如果直接枚举两个端点复杂度至少O(n^2)通常无法承受。
如果考虑枚举路径的LCA通过一些奇技淫巧计算,通常至少需要dfs一遍子树,复杂度依旧无法承受。
因此可以考虑将所有路径分为两类:经过x的和不经过x的。
将经过x的路径全部处理完了之后,相当于是把x去掉,原图变成森林,对每一颗树进行类似做法。
显然如果每一层计算的复杂度是O(n)的话那么最终复杂度取决于层数。
显然希望x的每颗子树不会大于原来的sz的一半,其实就是在求重心。
做法是堆每个点计算其子树最大值,更新即可。
模板:(未编译不知对不对)
int get_rt(int x,int f){sz[x]=1;maxsz[x]=0;for(int i=h[x];i;i=e[i].pre)if(e[i].to!=f&&!vis[e[i].to]){get_rt(e[i].to,x);sz[x]+=sz[e[i].to];maxsz[x]=max(maxsz[x],sz[e[i].to]);}maxsz[x]=max(maxsz[x],full_sz-sz[x]);if(maxsz[x]<maxsz[rt]) rt=x;return 0;}int get_sz(int x,int f){sz[x]=1;for(int i=h[x];i;i=e[i].pre)if(!vis[e[i].to]&&e[i].to!=f)sz[x]+=get_sz(e[i].to,x);return sz[x];}int calc(int x,int f){//solve it!}int dfs(int x){rt=0;get_rt(x,0);get_sz(x=rt,0);vis[x]=true;for(int i=h[x];i;i=e[i].pre)if(!vis[e[i].to]) calc(e[i].to,x);for(int i=h[x];i;i=e[i].rpe)if(!vis[e[i].to]) dfs(e[i].to);}int main(){full_sz=n;maxsz[rt]=n+1;dfs(1);return 0;}
阅读全文
0 0
- [学习笔记] 点分治学习笔记
- 点分治学习笔记(1)
- 点分治学习笔记(2) tree
- 学习笔记: cdq分治
- 学习笔记: cdq分治
- 学习笔记:树分治
- 【点分治】的学习笔记和众多例题
- BZOJ1095 & 动态点分治(好像应该叫点分树?)学习笔记
- 算法学习笔记 2.2分治
- 树的直径、树的重心与树的点分治学习笔记
- 算法导论学习笔记--1--分治排序
- 学习笔记(二)分治排序
- 算法学习笔记——分治法
- 学习笔记之递归和分治思想
- 【算法学习笔记】之分治算法
- 【学习笔记】递归和分治策略
- 算法学习笔记之分治算法
- 学习笔记——cdq分治
- XYNU OJ 1110—1121基础题(适合于C语言初学者)
- java集合WeakHashMap测试
- 精确探测时间
- Java对象克隆详解
- 解析结构体和位段
- [学习笔记] 点分治学习笔记
- 深度学习(Deep Learning) 学习笔记整理系列- 八
- 程序员,为什么写不好一份简历?
- 网络爬虫工作原理详解
- 指定环境变量
- 4.odoo入门——培训签到课程项目(二),后端逻辑
- spring学习之---spring的AOP
- 算法铺子之排序---插入排序
- PHP检测代码执行时间