![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树上启发式合并
Frozen_Guardian
已退役菜鸡Acmer
展开
-
牛客 - 合约数(树上启发式合并)
题目链接:点击查看题目大意:给出一棵树,规定 y 是 x 的合约数是指 y 是合数且 y 是 x 的约数,设 f[ i ] 是以 i 为根节点时,子树内关于权值 val[ i ] 的合约数个数,求出所有的 f[ i ]题目分析:看到子树问题不难想到树启,因为 val[ i ] 的取值范围是 1e4,所以可以预处理出每个数字的合约数,时间复杂度是 O( nsqrt( n ) ) 的,输出了一下发现,最多的一个数字所可以匹配的合约数最多只有 59 个,所以对于每个 val[ i ] 来说可以暴力枚举所.原创 2020-11-16 10:52:03 · 198 阅读 · 4 评论 -
2020CCPC(长春) - Strange Memory(树上启发式合并+位运算)
题目大意:给出一棵n 个点组成的有根树,一号节点是根节点,现在要求实现 n * n 的公式:题目分析:树上启发式合并,需要修改部分内部实现,如果可以想到树启的话,那么应该往子树上去靠拢,当每个点作为子树的根时,其可以作为 lca 然后去统计子树中可以匹配的 ( u , v ) 点对,这个题目因为 a[ i ] != 0,换句话说,点 u , v , lca( u , v ) 一定是互不相同的三个点,极大程度上简化了题目(因为三个点的形式一定是一个分叉的形状,不可能是链状的),换句话说,当 lca ...原创 2020-11-09 19:30:25 · 2436 阅读 · 7 评论 -
中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)
题目链接:点击查看题目大意:给出一棵 n 个节点的树,以点 1 为根,现在对于每个节点作为根的子树求解:子树中有多少个编号不相交的连续子段,如:1 2 4 5 7,共有三个连续的段,分别为 [ 1 , 2 ] , [ 4 , 5 ] , [ 7 ]题目分析:树上启发式合并的模板题,cal 函数中直接维护一个数组用来统计加入或删除掉一个数字后对于贡献的影响即可:如果编号 x - 1 和 x + 1 早已存在,那么加入 x 后总段数减一 如果编号 x - 1 或 x + 1 早已存在,那么加入..原创 2020-10-12 17:56:08 · 498 阅读 · 0 评论 -
CodeForces - 208E Blood Cousins(树上倍增+二分/树上启发式合并)
题目链接:点击查看题目大意:给出n棵树,再给出m个询问,每次询问给出两个整数u和k,先假设u在k层之上的祖先是p,问与u在同一层深度,并且公共祖先都是p的节点有多少个题目分析:因为先要求出u在第k层之上的祖先,我们可以利用树上倍增很简单的求出,但接下来的操作我是没想到的,虽然鲲学长已经给了提示需要二分,我也看出了直接dfs暴力找肯定会T掉的,但没设计出合适的二分来处理这个题,憋不住去网上看...原创 2019-11-07 19:11:03 · 476 阅读 · 0 评论 -
CodeForces - 600E Lomsat gelral(树上启发式合并)
题目链接:点击查看题目大意:给出一棵树,每个节点都有一个编号代表一种颜色,现在对于每个子树求出现最多的颜色的编号之和题目分析:因为n给到了1e5,看完这个题第一反应就是暴力n*n,但显然是会超时的,既然是在树上那么考虑用树链剖分+线段树优化,可还不是最优解,用树上莫队也不太行,莫队会带着一个根号,我们需要带着log,于是就学习了一波树上启发式合并,时间复杂度只有nlogn,原理就是利用子树...原创 2020-01-14 15:14:35 · 313 阅读 · 0 评论 -
CodeForces - 570D Tree Requests(树上启发式合并)
题目链接:点击查看题目大意:给定一个以1为根的n个节点的树,每个点上有一个字母(a−z),每个点的深度定义为该节点到1号节点路径上的点数,每次询问a,b查询以a为根的子树内深度为b的节点上的字母重新排列之后是否能构成回文串题目分析:因为是关于每个子树的询问,所以可以试着用树上启发式合并考虑,具体问题需要具体分析,对于这个题目而言,主要是判断以某个结点为根节点的子树中,深度为d的结点中,出现...原创 2020-01-14 16:15:09 · 341 阅读 · 0 评论 -
CodeForces - 246E Blood Cousins Return(树上启发式合并)
题目链接:点击查看题目大意:给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor,每个节点有名字,名字不唯一。多次查询,给出 u 和 k,问以 u 为根节点的子树下有多少个深度为 dep[u] + k 的节点(dep[u] 为节点 u 的深度)。题目分析:有了之前那道题目的铺垫后:CodeForces - 208E Blood Cousins,这道题目机会...原创 2020-01-14 18:13:15 · 290 阅读 · 0 评论 -
CodeForces - 375D Tree and Queries(树上启发式合并)
题目链接:点击查看题目大意:给出一棵有根树,每个节点都有一个编号代表颜色,现在给出m个询问,每个询问的形式为u k,需要回答以u为根节点的子树中,数量超过k的颜色有多少种题目分析:树上启发式合并模板题,只不过一开始我不太会处理如何快速获取超过k的颜色有多少种,傻傻的想了半天数据结构无果,想用map二分,结果发现只能对key二分,而不能对val二分,如果模拟的话又太麻烦,如果直接暴力的话时间...原创 2020-01-15 22:58:51 · 380 阅读 · 0 评论 -
牛客 - 阔力梯的树(树上启发式合并)
题目链接:点击查看题目大意:给出一棵树,每个节点都有一个编号,现在规定每个节点的“结实程度”为其子树中所有的编号排序后相邻两个数之差的平方和,现在需要求出每个节点的“结实程度”题目分析:因为离线+对每个子树的操作,所以可以用树上启发式合并nlogn解决问题, 对于每次更新/删除操作,因为题目的计算方法的前提是有序,并且每个编号两两都不互相重复,所以我们可以直接用一个set来维护,对于统计答...原创 2020-01-22 17:21:57 · 460 阅读 · 0 评论 -
山东理工大学第十二届ACM程序设计竞赛 - Cut the tree(树上启发式合并+线段树)
题目链接:点击查看题目大意:给一个具有 N 个节点的有根树,以 1 号节点为根,节点编号从 1 开始,点有点权。树的第 H 层权值为深度为 H 的所有点的点权之和。树的总权值为所有层权值的最大值。问分别割掉以 1,2,..,N 为根的子树后,剩余树的总权值为多少。题目分析:因为题目提示了,弱化数据后支持双 log 的算法。。所以不难想到树上启发式合并+线段树,两个模板套起来就过了,线段树负责处理区间最大值问题,每次更新子树信息的时候,单点更新一下相关层的最大值就好了,记得回溯代码:#i.原创 2020-06-21 19:33:21 · 590 阅读 · 0 评论