要求每个点子树中节点最多的层数,一个通常的思路是树上启发式合并,对于每一个点,保留它的重儿子的贡献,暴力扫轻儿子将他们的贡献合并到重儿子里来。

参考重链剖分,由于一个点向上最多只有$log$条轻边,故每个点最多被合并$log$次。但这不是这题想说的。

由于我们只保留以深度为下标的信息,重链剖分就会多算,以此引出长链剖分,权且作为一个模板来学习。

长链剖分时,每个点以最深的儿子作为长儿子,其余为短儿子。

每个点$O(1)$继承长儿子的信息,将短儿子的信息合并上来。每个点只有作为短儿子时才保留以它为链头的一条长链上的信息,空间复杂度为$O(链长)$。

显然,每次短儿子被合并之后就不会再被访问到了,因为它合并到了一条比它更长的链,而所有的长链都不相交,每条链都以$O(链长)$被合并掉,故总复杂度是$O(n)$的。

这道题只要维护深度为$i$的节点的数量,取最大值即可。

$\bigodot$技巧&套路:

  • 以深度为下标的信息,可以考虑长链剖分。
  • 通常信息的合并,DSU on tree就可以了。

 1 #include <cstdio>
 2 #include <vector>
 3
 4 const int N = 1000005;
 5
 6 int n, hig[N], res[N], son[N], dep[N];
 7 std::vector<int> g[N];
 8
 9 int yun, las[N], to[N << 1], pre[N << 1];
10 inline void Add(int a, int b) {
11     to[++yun] = b; pre[yun] = las[a]; las[a] = yun;
12 }
13
14 void Dfs(int x, int Fa) {
15     for (int i = las[x]; i; i = pre[i]) if (to[i] != Fa) {
16         Dfs(to[i], x);
17         if (hig[x] < hig[to[i]] + 1) {
18             hig[x] = hig[to[i]] + 1;
19             son[x] = to[i];
20         }
21     }
22     if (!son[x]) {
23         g[x].push_back(1); return;
24     }
25     std::swap(g[x], g[son[x]]);
26     res[x] = res[son[x]];
27     for (int i = las[x]; i; i = pre[i]) if (to[i] != Fa) {
28         if (son[x] != to[i]) {
29             int nx = (int)g[x].size(), nt = (int)g[to[i]].size();
30             for (int j = 0; j < nt; ++j) {
31                 g[x][nx - nt + j] += g[to[i]][j];
32                 if (g[x][nx - nt + j] >= g[x][res[x]]) res[x] = nx - nt + j;
33             }
34         }
35     }
36     g[x].push_back(1);
37     if (g[x][res[x]] == 1) res[x] = (int)g[x].size() - 1;
38 }
39
40 int main() {
41     scanf("%d", &n);
42     for (int i = 1, x, y; i < n; ++i) {
43         scanf("%d%d", &x, &y);
44         Add(x, y); Add(y, x);
45     }
46     Dfs(1, 0);
47     for (int i = 1; i <= n; ++i) {
48         printf("%d\n", hig[i] - res[i]);
49     }
50
51     return 0;
52 }

View Code

转载于:https://www.cnblogs.com/Dance-Of-Faith/p/9322458.html

【Cf Edu #47 F】Dominant Indices(长链剖分)相关推荐

  1. 【CF1009F】 Dominant Indices (长链剖分+DP)

    题目链接 \(O(n^2)\)的\(DP\)很容易想,\(f[u][i]\)表示在\(u\)的子树中距离\(u\)为\(i\)的点的个数,则\(f[u][i]=\sum f[v][i-1]\) 长链剖 ...

  2. 【luogu CF1009F】Dominant Indices(长链剖分优化DP)

    Dominant Indices 题目链接:luogu CF1009F 题目大意 给你一棵以 1 为根的树,设 d(u,x) 为 u 子树总到 u 距离为 x 的点数. 然后要你对于每个点 x 都要求 ...

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

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

  4. 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)

    永琳需要协助紫解决异变! 在某个满月的夜晚,幻想乡的结界出现了异常,虽然目前还没有找到原因,不过有一点可以肯定的是,这次异变一定和满月有关.间隙妖怪紫在试图修复结界时需要永琳帮她排除满月产生的干扰,为 ...

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

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

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

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

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

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

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

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

  9. 【THUSC2018】史莱姆之友【长链剖分】【链分治NTT】

    不知道这题能不能发出来,如果不能请联系我,我什么都会做的 题意:给一棵 nnn 个结点的树,每个结点有个 ax+bax+bax+b,求所有根到叶子的乘积之和.系数模 99824435399824435 ...

最新文章

  1. 织梦后台添加友链,前台不显示|修改友情链接的显示行数
  2. Linux疑难杂症解决方案100篇(二十)-万字长文带你读懂正则表达式(建议收藏)
  3. pandas中loc、iloc与ix的用法比较
  4. JVM 内存设置大小(Xms Xmx PermSize MaxPermSize 区别)
  5. 顶级程序员的心得ndash;Coders at Work
  6. 腾讯四位创始人向深圳大学捐3.5亿元:启动人才基金
  7. BTC 5分钟内跌幅1.02%,现价38142.29usdt
  8. NFV-Bench A Dependability Benchmark for Network Function Virtualization Systems
  9. Eclipse debug ‘Source not found’
  10. 乐优商城(一)项目介绍
  11. 【目标检测算法系列】一、R-CNN算法
  12. 网络安全—社会工程学
  13. C++获取Unix时间戳(分别以秒和毫秒为单位)的几种方法
  14. 常用网络拓扑在网络规划设计中
  15. wps怎么自动生成目录?2分钟完成
  16. HTTP常见状态码 2xx 3xx 4xx 5xx
  17. 系统集成项目管理工程师(软考中级)—— 第二十二章 安全管理 笔记分享
  18. 溴PEG溴,Br-PEG-Br
  19. APP开发-第三方SDK使用
  20. 小哥Cadence Allegro 132讲字幕版PCB设计视频教程-cadence视频-allegro视频-PCB视频

热门文章

  1. maven-assembly-plugin 和 maven-shade-plugin打包插件的区别
  2. arthas使用示例:trace追踪方法调用路径及统计方法耗时
  3. linux 产生0~3之间的随机数
  4. Apollo本地jar包启动方法
  5. 架构设计:Vue+nginx+jwt+zuul+eureka+ribbon+hystrix+rabbitmq+mysql集群+redis集群+elsticsearch集群
  6. Linux vim替换操作
  7. 【软考-软件设计师】CPU的功能
  8. java中 indexOf() 与lastIndexOf() 用法详解
  9. centos7自带python版本_CentOS7保留默认Python版本并安装更新Python2和Python3共存
  10. QML中类似QMap的用法