代码编织梦想

一.引入

其实一个合理的引入对学生的兴趣影响很大

− c q b z g m \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad -cqbzgm cqbzgm

但是竞赛哪里有那么多兴趣 , 更重要的是恒心与毅 力    ( 虽然我没有   但是竞赛哪里有那么多兴趣,更重要的是恒心与毅力_{~~(虽然我没有~~} 但是竞赛哪里有那么多兴趣,更重要的是恒心与毅  (虽然我没有  

二.算法介绍

树链剖分,顾名思义,指一种对树进行划分的算法,它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组、BST、SPLAY、线段树等)来维护每一条链。

− 源于百度百科 \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad -源于百度百科 源于百度百科

三.实现

光写个概念是无用的,我们还得去想办法实现.

我们先引入一点东西:

重儿子:一个结点的所有儿子中,子树节点数最多的那个

轻儿子:一个结点除重儿子以外的其他儿子

重链:从一个轻儿子开始,一直往他的重儿子走出的链

轻链:除重链外的其他链

然后看这张图:

在这里插入图片描述

我们用黄色来标记重儿子和重链:
在这里插入图片描述

再按照优先遍历重链对结点重新编号:

在这里插入图片描述

然后你就会发现,我们完成了 d f s dfs dfs序.

根据以上的流程,我们就可以写 d f s dfs dfs序了.

代码:

/*
dfs1:找出所有结点之间的关系 并求得每个结点的重儿子
dfs2:对所有结点重新编号
id[u]:dfs序后的编号
tmp[cnt]:序号cnt对应结点u
fa[u]:u的父亲结点
d[u]:u的深度
size[u]:u为根节点的子树的结点个数
son[u]:u的重儿子
top[u]:u所在的重链顶端结点
*/
void dfs1(int u){
	size[u] = 1, d[u] = d[fa[u]] + 1;//这个点本身size=1,深度为他父亲+1
	for(int i = head[u]; i; i = g[i].next){
		int v = g[i].to;
		if(v == fa[u])continue;
		fa[v] = u;
		dfs1(v);
		size[u] += size[v];
		if(size[son[u]] < size[v])son[u] = v;//求重儿子
	}
}
void dfs2(int u, int front){
	top[u] = front, id[u] = ++ cnt, tmp[cnt] = u;
	if(son[u])dfs2(son[u], front);
	for(int i = head[u]; i; i = g[i].next){
		int v = g[i].to;
		if(v != fa[u] && v != son[u])dfs2(v, v);//一个点位于轻链底端,那么他的top必然是它本身
	}
}

然后我们就可以迎接例题了~~(终于写完了 h h h _{hhh} hhh~~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cqbzcypsy/article/details/128822957

https://mp.weixin.qq.com/s?src=11×tamp=1509090286&ver=477&signature=cgdv6tbrm5s58sua9fgt7bbpm*a_zhang405744522的博客-爱代码爱编程

机器学习与微博:TensorFlow在微博的大规模应用与实践 2017-08-08  何沧平  AI前线 作者|何沧平编辑|陈思TensorFlow 在微博业务中有丰富的应用场景,文字、图片、视频,各具特色。微博机器学习平台集成 TensorFlow 服务,支持分布式

【模板】线段树板子-爱代码爱编程

【洛谷日报#209】线段树分治总结 线段树分治是用线段树的分治性维护时间区间,它可以支持撤销操作、或者说维护了一个操作影响的时间区间 那些年我用线段树做过的题目:有些是题解链接,有些是题目链接 查区间第k小 求区间最大值、和 查询区间内剩余数量 - 牛客 · 借教室 找到编号最小且能塞的下物品的容器 - NIT21280 · 仓鼠的鸡蛋 给一

OIer有趣代码+资料整理 1.0.0.8.7-爱代码爱编程

版本号:1.0.0.8.7 最后更新时间:2020-7-6 09:53:39 总字数:35055扫码手机看! 前言 #include <iostream> //C++调节字体颜色 #include <windows.h> using namespace std; int main() { cout << "原色te

树[数据结构]的杂题不多解释-爱代码爱编程

树状数组 1 :单点修改,区间查询 题目描述 输入一个数列A1,A2….An(1<=N<=100000),在数列上进行M(1<=M<=100000)次操作,操作有以下两种: (1) 格式为C I X,其中C为字符“C”,I和X(1<=I<=N,|X|<=10000)都是整数,表示把把a[I]改为X (2)

基于遗传算法的南昌周边城市旅游规划研究(python实现)_小盗啊1247949232@qq.com的博客-爱代码爱编程

当前,国民生活水平得到大幅提升,人均汽车拥有量越来越多,自驾周边城市游也成为越来越多家庭节假日期间的选择,旅游路径规划成为研究热点。旅游路径规划问题是基于经典旅行商问题( TSP) 演变而来的,目前主要应用于物流路径规划领域

2023.1.13模拟赛总结-爱代码爱编程

2023.1.13模拟赛总结 实质上是阶段性学习检测。 T1:线段树 直接建一棵区间为1~m的线段树,每插入一点就将该点值修改,维护区间最大值。 #include<bits/stdc++.h> using

【ybt2023寒假day1 b】不跪模样(树链剖分)(线段树)-爱代码爱编程

不跪模样 题目链接:YBT2023寒假Day1 B 题目大意 给你一棵有根数,点有点权,两种操作: 对于所有 x 子树内与 x 距离不超过 2 的点,将其点权加 v。 询问 x 子树中,满足 i<=j 且 i,j

day52最长递增子序列-爱代码爱编程

力扣300.最长递增子序列 题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/ 思路 dp数组的含义 dp[i]表示,以nums[i]结

2023寒假集训5(1月9日)-爱代码爱编程

2023寒假集训5(1月9日)-算法竞赛-4.10树链剖分-cf>1800 题解 A - 轻重链剖分/树链剖分 树链剖分模板题 #include <bits/stdc++.h> #define int

hfss学习记录——0. hfss软件安装(ansys electromagnetics suite 2023 r1)_hfss仿真软件-爱代码爱编程

目录 0. 引言1. 安装版本2. 安装注意事项3. 安装包4. 安装步骤5. 版本介绍6. 版本更新内容6.1 注意事项6.2 使用感受 7. 有关软件的一些其他信息7.1 各个版本支持的系统不同7.2