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

参考重链剖分,由于一个点向上最多只有$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. 扫描分发Apriori算法学习(一)
  2. MySQL errno: 145 错误修复
  3. Microsoft Exchange 2010 安装配置
  4. python3 随机数函数
  5. 【学习笔记】java基础核心总结
  6. python基础系列教程——python所有包库的下载
  7. 简易 IM 双向通信电脑端 GUI 应用——基于 Netty、JavaFX、多线程技术等
  8. php+正则匹配qq,正则表达式对qq号进行验证的实例
  9. [10] ADB 修改设置
  10. 列举至少五个python内置函数和使用方法_Python内置函数 next的具体使用方法 Python中seek和next区别...
  11. 开源优势_企业开源的10大优势
  12. 三丰三坐标编程基本步骤_加工中心开机回零的两种基本方式及常见问题的应对方法...
  13. 华为nova 8i渲染图曝光:背部设计神似Mate30
  14. SPA单页面应用、前后端分离项目SEO优化的方法
  15. 【三维路径规划】基于matlab遗传算法无人机三维路径规划【含Matlab源码 1526期】
  16. pscc2019滤镜抽出_ps抽出滤镜(Extractplus.8bf)下载_ps抽出滤镜(Extractplus.8bf)官方下载-太平洋下载中心...
  17. Python Str字符串 字符串常用方法 定义 创建 拆分 成分判断 大小写调整 格式化 填充 替换 访问 查找
  18. 低成本搭建Time Machine 服务器
  19. 怎么取消微信送票服务器,微信抢火车票怎么取消?有什么要注意的吗?
  20. 盘点老外对女人的爆笑称呼

热门文章

  1. 【收藏】QGIS加载xyz格式地图(以高德影像图和路网为例)
  2. docker运行redis:windows环境运行挂载目录的正确写法、-v挂载data目录、-v挂载redis.conf配置文件以及设置访问密码
  3. ubuntu18.04安装python3.7并将python3指向python3.7
  4. 幂等性概念及数据库乐观锁机制
  5. 限速会自动恢复吗_骨折会自己好吗?骨折后怎样做恢复快?
  6. 【已解决】单片机串口通讯中RXD与TXD如何连线?
  7. vue+axios天气查询——天知道效果展示及源码分析
  8. 怎么设置某个用户生成hdfs文件的权限_HDFS简明入门教程
  9. 2.1.2 操作系统之进程的状态(运行、就绪、阻塞、创建、终止)及转换(就绪-运行、运行-就绪、运行-阻塞、阻塞-就绪)
  10. Cpp 对象模型探索 / delete 运算符内部调用过程分析