树上启发式合并
bandiaoz_cjl
这个作者很懒,什么都没留下…
展开
-
Problem - K Russian Dolls on the Christmas Tree - Codeforces (树上启发式合并)
Problem - K Russian Dolls on the Christmas Tree - Codeforces题意有一棵 nnn 个节点的树,节点编号为 1−n1-n1−n,111 号节点是根。问以每个节点为根的子树中,有多少个连续区间。解法子树?离线?立即推:树上启发式合并!统计子树每个编号的点出现的次数,同时维护答案;如果编号为 uuu 的点从无到有,就看编号为 u−1u-1u−1 和 u+1u+1u+1 的点的出现情况,如果都出现了,就说明两个区间合并为一个,区间数减一,如果都原创 2020-11-24 10:32:17 · 205 阅读 · 0 评论 -
Problem - 208E - Codeforces (树上启发式合并+倍增)
Problem - 208E - Codeforces题意给定一棵描述 nnn 个人的家族关系树,两个人有相同的 kkk 祖先,则两个人就是 kkk 兄弟。给出 mmm 次询问,询问 vvv 有几个 kkk 兄弟。解法可以先用倍增找到 vvv 的 kkk 祖先 rrr,那么问题就转换成了求 rrr 的某深度的孩子的数量。这就变成了树上启发式合并的板子题了。解法#pragma region#include <algorithm>#include <cmath>#i原创 2020-11-24 09:34:59 · 88 阅读 · 0 评论 -
CodeForces - 246E Tree and Queries (dsu on tree)
CodeForces - 246E Tree and Queries题意一个家族有 nnn 个人,构成了树的关系,但不一定是连通的。每个人有一个名字,但是名字不一定是唯一的。给出 qqq 个询问,每次询问编号为 vvv 的节点第 kkk 代孩子有多少不同的名字。解法离线的子树问题,考虑dsu on tree先记录下每个询问,即以节点vvv 为根有几次询问,记录是第几次询问以及 kkk 的值;第几代孩子可以用深度来维护;用 mapmapmap 来记录名字出现的次数,用一个 cnttcnttcn原创 2020-11-23 23:58:07 · 202 阅读 · 0 评论 -
CodeForces - 375D Tree and Queries 树上启发式合并 树状数组
CodeForces - 375D Tree and Queries题意一棵 nnn 个节点的树,每个节点都有一个颜色 colicol_icoli ,有 mmm 次询问,问以 vvv 为根的子树中,有多少个颜色 ccc 满足至少有 kkk 个点的颜色为 ccc 。解法离线的子树问题,考虑树上启发式合并(dsu on tree)。每次统计出子树中某个颜色的数量,然后用树状数组维护颜色数量为某个值的答案。使用 dsu on tree 来优化搜索,使得每次先搜轻孩子,删去贡献后搜重孩子,并保留贡原创 2020-11-23 19:55:52 · 168 阅读 · 1 评论 -
山东理工大学第十二届ACM程序设计竞赛 - Cut the tree 树上启发式合并
Cut the tree题意一棵 n(2≤n≤1⋅105)n(2\le n \le 1\cdot 10^5)n(2≤n≤1⋅105) 个节点的树,111 号结点是根节点,每个点有一个点权。树的第 HHH 层权值为深度为 HHH 的所有点权之和。树的总权值为所有层权值的最大值。问分别割掉以 1,2,…,n1,2,\dots,n1,2,…,n 为根的子树后,剩余树的权值是多少。解法使用线段树维护每一层的权值的区间最大值,子树问题考虑树上启发式合并,每次暴力修改,然后还原轻孩子的影响即可。复杂度为 O(n原创 2020-11-19 21:44:05 · 392 阅读 · 0 评论 -
阔力梯的树 树上启发式合并
阔力梯的树题意一棵 n(1≤n≤105)n(1\le n \le 10^5)n(1≤n≤105) 个结点的树,111 是根节点。一个结点的结实程度是 ∑i=1k−1(ai+1−ai)2\sum_{i=1}^{k-1}(a_{i+1}-a_i)^2∑i=1k−1(ai+1−ai)2 ,其中 aia_iai 为子树的结点编号按照升序排序。求每个结点的结实程度。解法离线的子树问题,考虑树上启发式合并。用一个 setsetset 来维护子树的所有结点,然后每次插入或者删除结点的时候,更新答案即可,原创 2020-11-19 16:53:32 · 84 阅读 · 0 评论 -
CodeForces - 570D D. Tree Requests 树上启发式合并
Codeforces Round #316 (Div. 2) D. Tree Requests题意有一棵 n(1≤n≤5⋅105)n(1\le n \le 5\cdot 10^5)n(1≤n≤5⋅105) 个结点的树,树上每个结点都有一个小写字母,根结点是 111 ,根结点的深度是 111 ,然后有 q(1≤q≤2⋅105)q(1\le q \le 2\cdot 10^5)q(1≤q≤2⋅105) 个询问,每次询问 vvv 的子树所有深度为 ddd 的结点的字母能否组成一个回文串。解法首先,组成回文原创 2020-11-19 14:16:02 · 88 阅读 · 0 评论 -
合约数(树上启发式合并)
合约数题意有一棵 nnn 个点 n−1n-1n−1 条边的带权树,每个点的权值是 a[i]a[i]a[i] ,定义 F(i)F(i)F(i) 为以 iii 为根的所有子树中,点的权值是合数且是 a[i]a[i]a[i] 的约数的个数。求 ∑i=1ni⋅F(i)\sum_{i=1}^{n} i\cdot F(i)∑i=1ni⋅F(i) 。结果取模 109+710^9+7109+7 。解法可离线的子树问题,考虑树上启发式合并。记录子树每个权值出现的次数,然后算 a[u]a[u]a[u] 的每个合约数的原创 2020-11-17 19:58:52 · 120 阅读 · 0 评论