【Cf Edu #47 F】Dominant Indices(长链剖分)
要求每个点子树中节点最多的层数,一个通常的思路是树上启发式合并,对于每一个点,保留它的重儿子的贡献,暴力扫轻儿子将他们的贡献合并到重儿子里来。
参考重链剖分,由于一个点向上最多只有$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(长链剖分)相关推荐
- 【CF1009F】 Dominant Indices (长链剖分+DP)
题目链接 \(O(n^2)\)的\(DP\)很容易想,\(f[u][i]\)表示在\(u\)的子树中距离\(u\)为\(i\)的点的个数,则\(f[u][i]=\sum f[v][i-1]\) 长链剖 ...
- 【luogu CF1009F】Dominant Indices(长链剖分优化DP)
Dominant Indices 题目链接:luogu CF1009F 题目大意 给你一棵以 1 为根的树,设 d(u,x) 为 u 子树总到 u 距离为 x 的点数. 然后要你对于每个点 x 都要求 ...
- 树链剖分之长链剖分 详解 题目整理
树链剖分 题目中出现的树链剖分一般分为两种,重链剖分和长链剖分 重链剖分:选择子树最大的儿子, 将其归入当前点所在 的同一条重链 长链剖分:选择向下能达到的深 度最深的儿子,将其归 入当前点所在的同一 ...
- 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)
永琳需要协助紫解决异变! 在某个满月的夜晚,幻想乡的结界出现了异常,虽然目前还没有找到原因,不过有一点可以肯定的是,这次异变一定和满月有关.间隙妖怪紫在试图修复结界时需要永琳帮她排除满月产生的干扰,为 ...
- BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)
题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...
- Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)
题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我 ...
- BZOJ4381[POI2015]Odwiedziny——分块+长链剖分
题目描述 给定一棵n个点的树,树上每条边的长度都为1,第i个点的权值为a[i]. Byteasar想要走遍这整棵树,他会按照某个1到n的全排列b走n-1次,第i次他会从b[i]点走到b[i+1]点,并 ...
- 长链剖分:O(nlogn)预处理O(1)求kth祖先
前言 一个长链剖分的小trick 问题 如题,数据范围大概10510^5105 思路 我们知道重链剖分是什么,即选择自己儿子中子树节点树最大的作为重儿子,其它儿子为轻儿子 而长链剖分则是选择儿子中子树 ...
- 【THUSC2018】史莱姆之友【长链剖分】【链分治NTT】
不知道这题能不能发出来,如果不能请联系我,我什么都会做的 题意:给一棵 nnn 个结点的树,每个结点有个 ax+bax+bax+b,求所有根到叶子的乘积之和.系数模 99824435399824435 ...
最新文章
- 扫描分发Apriori算法学习(一)
- MySQL errno: 145 错误修复
- Microsoft Exchange 2010 安装配置
- python3 随机数函数
- 【学习笔记】java基础核心总结
- python基础系列教程——python所有包库的下载
- 简易 IM 双向通信电脑端 GUI 应用——基于 Netty、JavaFX、多线程技术等
- php+正则匹配qq,正则表达式对qq号进行验证的实例
- [10] ADB 修改设置
- 列举至少五个python内置函数和使用方法_Python内置函数 next的具体使用方法 Python中seek和next区别...
- 开源优势_企业开源的10大优势
- 三丰三坐标编程基本步骤_加工中心开机回零的两种基本方式及常见问题的应对方法...
- 华为nova 8i渲染图曝光:背部设计神似Mate30
- SPA单页面应用、前后端分离项目SEO优化的方法
- 【三维路径规划】基于matlab遗传算法无人机三维路径规划【含Matlab源码 1526期】
- pscc2019滤镜抽出_ps抽出滤镜(Extractplus.8bf)下载_ps抽出滤镜(Extractplus.8bf)官方下载-太平洋下载中心...
- Python Str字符串 字符串常用方法 定义 创建 拆分 成分判断 大小写调整 格式化 填充 替换 访问 查找
- 低成本搭建Time Machine 服务器
- 怎么取消微信送票服务器,微信抢火车票怎么取消?有什么要注意的吗?
- 盘点老外对女人的爆笑称呼
热门文章
- 【收藏】QGIS加载xyz格式地图(以高德影像图和路网为例)
- docker运行redis:windows环境运行挂载目录的正确写法、-v挂载data目录、-v挂载redis.conf配置文件以及设置访问密码
- ubuntu18.04安装python3.7并将python3指向python3.7
- 幂等性概念及数据库乐观锁机制
- 限速会自动恢复吗_骨折会自己好吗?骨折后怎样做恢复快?
- 【已解决】单片机串口通讯中RXD与TXD如何连线?
- vue+axios天气查询——天知道效果展示及源码分析
- 怎么设置某个用户生成hdfs文件的权限_HDFS简明入门教程
- 2.1.2 操作系统之进程的状态(运行、就绪、阻塞、创建、终止)及转换(就绪-运行、运行-就绪、运行-阻塞、阻塞-就绪)
- Cpp 对象模型探索 / delete 运算符内部调用过程分析