思路来源

https://blog.nowcoder.net/n/5eaebd22f5f846838c637bc337cc1ee9

https://blog.csdn.net/litble/article/details/87965999

知识点整理

长链剖分,用于维护子树中只与深度有关的信息,多用于静态

从任何一个点往上跳到根,最多经过条不同的长链。

长链剖分,顾名思义,每个点维护子树中最长的那一条链,

[l[x],l[x]+len[x]-1]是其长链区间,到l[x]的偏移量也确定了它的深度

和dsu on tree类似,但若干条链分别占用不同位置的数组空间,只有相同链的内存共用,

所以不用像dsu on tree那样清空内存,所以预处理长链长度之后,只需要三步

①搜长儿子,继承长儿子的答案

②把短儿子往长儿子上挂,计算短儿子的答案

③把自己这个节点挂上去

由于若干条长链不交,每个点在向上合并的时候,只会作为短链出现在一条链里,所以是O(n)的

似乎还是指针版的略快一点,然而习惯用数组下标写……

题目

n(n<=1e6)个点的树,

对于每个点,求其子树中出现节点最多的深度d,

如果存在多个深度,它们的节点个数相同,则返回最小的哪个

题解

搞个裸题,长链剖分合并,

首先继承长链答案,然后短链合并的时候,如果可更新则更新

最后check一下这棵子树的根的深度,判断其是否能更新答案

代码

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=1e6+10;
int son[N],len[N];//长儿子
int n,u,v;
int l[N],r[N],dfn;//长链的dfs序区间段
int sum[N],ans[N];
vector<int>e[N];
void dfs1(int u,int fa){for(int v:e[u]){if(v==fa)continue;dfs1(v,u);if(!son[u] || len[son[u]]<len[v]){son[u]=v;}}len[u]=len[son[u]]+1;
}
void dfs2(int u,int fa){l[u]=++dfn;r[u]=l[u]+len[u]-1;if(son[u]){dfs2(son[u],u);ans[u]=ans[son[u]]+1;//答案来自长儿子 }for(int v:e[u]){if(v==fa || v==son[u])continue;dfs2(v,u);//答案来自短儿子 for(int j=l[v],k=1;j<=r[v];++j,++k){sum[l[u]+k]+=sum[j];if((k>ans[u] && sum[l[u]+k]>sum[l[u]+ans[u]]) || (k<ans[u] && sum[l[u]+k]>=sum[l[u]+ans[u]])){ans[u]=k;}}}sum[l[u]]++;if(sum[l[u]]>=sum[l[u]+ans[u]]){ans[u]=0;}
}
int main(){scanf("%d",&n);for(int i=2;i<=n;++i){scanf("%d%d",&u,&v);e[u].pb(v);e[v].pb(u);}dfs1(1,0);dfs2(1,0);for(int i=1;i<=n;++i){printf("%d\n",ans[i]);}return 0;
} 

长链剖分(知识点整理+板子总结)相关推荐

  1. 长链剖分 总结 【知识点】

    附上自学博客链接 https://www.cnblogs.com/Khada-Jhin/p/9576403.html 概念: 长链剖分类似于重链剖分,只是选择链的标准: 不是 子树节点最多的儿子,而是 ...

  2. 树链剖分之长链剖分 详解 题目整理

    树链剖分 题目中出现的树链剖分一般分为两种,重链剖分和长链剖分 重链剖分:选择子树最大的儿子, 将其归入当前点所在 的同一条重链 长链剖分:选择向下能达到的深 度最深的儿子,将其归 入当前点所在的同一 ...

  3. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

  4. BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)

    题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...

  5. Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)

    题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我 ...

  6. BZOJ4381[POI2015]Odwiedziny——分块+长链剖分

    题目描述 给定一棵n个点的树,树上每条边的长度都为1,第i个点的权值为a[i]. Byteasar想要走遍这整棵树,他会按照某个1到n的全排列b走n-1次,第i次他会从b[i]点走到b[i+1]点,并 ...

  7. 【Cf Edu #47 F】Dominant Indices(长链剖分)

    要求每个点子树中节点最多的层数,一个通常的思路是树上启发式合并,对于每一个点,保留它的重儿子的贡献,暴力扫轻儿子将他们的贡献合并到重儿子里来. 参考重链剖分,由于一个点向上最多只有$log$条轻边,故 ...

  8. 长链剖分:O(nlogn)预处理O(1)求kth祖先

    前言 一个长链剖分的小trick 问题 如题,数据范围大概10510^5105 思路 我们知道重链剖分是什么,即选择自己儿子中子树节点树最大的作为重儿子,其它儿子为轻儿子 而长链剖分则是选择儿子中子树 ...

  9. 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

    [UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...

最新文章

  1. Python基本语法元素之温度转换
  2. 【SQL Server配置管理器】提示:无法连接到 WMI 提供程序。您没有权限或者该服务器无法访问...
  3. 机器学习算法(三): 基于支持向量机的分类预测
  4. 2018.1之后Standard Assets如何安装?
  5. 【MATLAB】设定坐标的轴的范围
  6. [BuildRelease]Mozilla Build Tools(自动设置VC环境)
  7. 电脑族每天必须吃的食品
  8. YII composer全局安装
  9. java thread detach_Java多线程小结
  10. 使用免费的Open NFC simulator模拟器在BlackBerry模拟器上进行NFC程序调试
  11. ubuntu18.04安装微信、QQ、百度网盘
  12. PDF内容太多分不清?这个PDF加页码的方法可以帮助你
  13. 如何在2022年建立自己的NFT市场平台
  14. 【电影推荐】风吹麦浪
  15. 名帖176 苏轼 行书《杜甫堂成诗卷》
  16. 红帽linux云计算提供商,神州数码获得红帽云计算及服务供应商认证
  17. python乳腺癌细胞挖掘
  18. 安卓四大组件(小白篇)
  19. java 生成正弦波声音_Java错误生成声音正弦波
  20. matlab振动信号数据,Matlab在场地微振动信号数据处理中的应用

热门文章

  1. win10开始菜单打不开_windows10系统电脑开始菜单无法打开的解决教程
  2. 地方网站运营分享、未来发展汇报 [十年巨献,纯干货,不忽悠]
  3. 不懂英语学计算机编程,不懂英语应该怎么学编程
  4. wow服务器维护精英怪,魔兽世界tbcp2精英怪去哪刷_wowtbc怀旧服p2稀有精英刷新点_3DM网游...
  5. 这么简单,抄抄,改改就行啦
  6. Redis升级到 6.x 版本后,12306网站起飞了!
  7. 冷暖自知!4年Java小伙收获美团Offer,分享他的社招Java岗4面面经
  8. 【电源专题】线性稳压器(LDO)简介
  9. 谷歌浏览器直接启动打印不预览解决方案
  10. Python将两个EXCEL去除(或保留)重复数据