树相关:树形dp&LCA&树上操作&dsu&树链剖分
文章平均质量分 73
各种树上操作,包括换根dp、LCA、启发式合并、树链剖分等
hans774882968
这个作者很懒,什么都没留下…
展开
-
【算法】苹果一道“24点”类型的面试题详细解析,小班同学也直呼通俗易懂
24点的dfs比较好理解,但如果没有专门学习过很难自己想出来。首先我们要了解表达式树。以下面这棵表达式树为例:它表示表达式1 * (2 + 3)。表达式树的叶子节点为数字,非叶子节点为二元运算符。我们dfs遍历这棵树,走到非叶子节点,需要先获取左右子树的运算结果,再根据该点的符号获取当前子树的运算结果。表达式树也可以很轻松地表示一元运算符。比如:表示表达式1 * (2 + 3!)。实际上,表达式树是抽象语法树(Abstract Syntax Tree,AST)的特殊情况,如果你有前端基础,可以进astexp原创 2023-12-13 02:29:46 · 146 阅读 · 0 评论 -
ICPC澳门20I——树链剖分优化空间复杂度,好题
传送门1或者传送门2注意,空间限制是8MB!这题太综合了,能独立写出来说明你能在澳门站拿金了。另外,树链剖分优化空间复杂度真的是我第一次听说~首先,它考察了一个博弈论的结论:若干石堆的Nim游戏,后手必胜等价于各石堆数异或和为0。所以原题等价于以下问题:保留一个子集(可空)的石堆,a属性的异或和为0,且b属性的和最大。这显然是一个01背包(大概每一个关注“树链剖分”的人都会吧~),dp表示保留出的最大b属性和,bTot - dp[idx][0]即所求。于是我们有如下代码:#include <b原创 2021-11-07 16:26:42 · 665 阅读 · 0 评论 -
ICPC20南京D-贪心结论+大模拟
传送门先随便找一棵生成树。假如这棵树不存在度数大于n/2的点,已经做完。否则这样的点一定只有1个(由树的度数之和易证)。那么我们就以它为根,记为rt,调整到rt符合要求为止。于是有一个不是很难想到的贪心调整方案:每次找一条不在树上但在图上的边(u,v),若连接以后构成的环包含rt,则对于rt的两个在环上的邻居(注:必定是2个),记为fu和fv,先尝试删除(rt,fu),如果这样导致u或v的度数不合题意,那么尝试删除(rt,fv),如果还不合题意,就放弃修改。有一种能成功,就直接采纳了,继续看下一条边(可原创 2021-10-23 16:28:47 · 152 阅读 · 0 评论 -
CF337D——换根dp
传送门题意一棵树,有些是红点。如果点u满足:每个红点到u的距离都<=D,则u符合题意。求合题意的点有多少个。注:题干用的是”小姐姐“,本文都用”红点“来指代。思路我们不妨求出离当前点最远的红点的距离值,这个距离<=D即符合题意。这是一个全局性的统计问题,所以我们很快能想到这是一个换根dp。定义down[u]是以u为子树的最远距离,up[u]是u子树以外的点的最远距离。up既可以定义为包含u,也可以定义为不包含。之所以up不定义为全局的,是因为max运算符不能做差。答案是max(dow原创 2021-10-23 16:02:27 · 164 阅读 · 0 评论 -
CCPC20长春F(gym102832F)——树上启发式合并
传送门题意对一个有点权的树,求以下公式的值:∑i=1n∑j=i+1n[a[i] xor a[j]=a[lca(i,j)]]∗(i xor j)\sum_{i=1}^{n}\sum_{j=i+1}^n [a[i] \ xor \ a[j] = a[lca(i,j)]] * (i\ xor \ j)i=1∑nj=i+1∑n[a[i] xor a[j]=a[lca(i,j)]]∗(i xor j)a数组的值是1~1e6原创 2021-10-23 13:51:38 · 134 阅读 · 0 评论 -
CF697C-考虑二叉树的LCA的性质
传送门题意给你一个可以认为是无穷大的完全二叉树,初始边权均为0。有两种操作:输入u,v,w,把u到v的唯一路径的每条边的边权都加上w输入u,v,求u到v的路径长度操作个数1000,点的编号范围1e18,1-indexed。思路树上唯一路径,必定是围绕LCA讨论。并且有一个常见且重要的性质:二叉树的点u的祖先(1-indexed),就是u的二进制的高若干位。所以求LCA的函数是可以十分方便地写出来的,模仿倍增LCA模板的一些技巧即可。int DEP(LL x){ int ans =原创 2021-10-23 01:30:39 · 186 阅读 · 0 评论 -
HRBUST2064-分析极端情况+倍增求树上距离
传送门。一道不错的思考题~建议自己先思考下,看有没有结论~我们不妨分析下,无法构成三角形的边最多能有多少条。设边从小到大为e[0],e[1],e[2]...,则要满足e[0]+e[1]<=e[2],e[1]+e[2]<=e[3]...。最坏情况就是斐波那契数列。而边权只有1e9,因此只需要求出这个范围内的斐波那契数列能容纳几项。设f[0]=f[1]=1,则f[51]=32951280099大于1e9。所以在边数大于60时,直接输出Yes是正确的。边数<=60时,直接暴力即可,相信大家原创 2021-10-22 23:39:53 · 93 阅读 · 0 评论 -
atcoder_abc221_f——树的直径好题
题意给你一棵n个点的树,边权都是1。设树的直径为D。你可以选至少两个点染色,求染色的点两两之间的距离都是D的染色方案数,模998244353。思路答案往往藏在题干里。我们必须围绕树的直径来思考。但是我们已掌握的关于树的直径的模型,只有一个:把树的直径看成一条链,链上每个点带一个子树。就像一条藤条上长着一些花朵。这里采用的模型是,以树的直径的中心为分界点,把树分为两份,并设x和y为树的直径的两端(任取即可)。如果D为奇数因为树的直径的中心处于边的中间,所以我们也可以说成是以连接pt1和pt2的边原创 2021-10-04 15:00:22 · 300 阅读 · 0 评论 -
美团2021届秋季校园招聘笔试-小美的区域会议——人工加入限制+树形dp
总结:集合划分的思想+树形dp+定义序关系(用于去重)直接按树形dp想,没有思路,因为你强行记录所选取方案集合的权值最小和最大显然不可做。此时考虑加入一些假设(限制)。假设当前枚举的点i是所选子树的点权最小的点(假设是最大的点也行)。不难发现遍历所有i对应的合法方案集合,是对所有合法方案的一个划分。以i为树根跑树形dp,保证所有选择的点的权值都在a[rt]~a[rt]+k即可。因为子树答案只会被使用一次,所以dp数组可以省略。时间复杂度:O(n^2)但是我们还面临一个问题:如果一个合法方案有多个最.原创 2021-07-29 00:34:59 · 683 阅读 · 4 评论