树上问题汇(近期)
T1—11.24A.path(树与 森林 DP)
【题目描述】
给定一张 n 个点,m 条边的无向无环带权图。
对于一个非空点集 A,如果存在一条简单路径经过点集内的所有点,则称它是好的,并设
f(A) 表示边权和最大的经过 A 中所有点的简单路径的边权和。
从所有好的点集中随机抽取一个点集 A,求 f(A) 的期望模 998244353 的值。
n ≤ 1 0 6 n\leq10^6 n≤106
Review
千万不要被奇怪的描述给蒙过去了,无向无环图就是森林啊—看题要仔细。
没有给出范围的变量也要注意,也许能因此发现理解错了的题意。
此题换根比较麻烦,则容易有在lca处合并路径贡献的想法。
由于看题时把“边权和”看作“边权和的和”,因此耗费许多时间。我要加强题目!!!
T2—11.25A.deconstruct(树与期望)
【题目描述】
有一棵以 1 为根的,有 n 个结点的,有根外向树。进行 (n -1) 次操作,每次 Mivik 都会从未删掉的边中等概率选择一条边将其删去。记这条边为 a → b,则删去这条边的代价是删边时 b 的子树大小(包括 b 自己);删去这条边后 b 为根的子树会形成一棵新的以 b 为根的有根树。
求,进行这 (n -1) 次操作后期望的代价总和是多少。期望的值对 109 + 7 取模。
n ≤ 2 × 1 0 6 n\leq 2\times10^6 n≤2×106
Review
子树大小不太好算。但我们只算代价总和,所以,
由于期望的线性性,我们考虑每个点作为子树中的点产生的贡献,
这样就相当于计算每个点被其上的链上的边计算的次数了,子树问题转为链上问题!
可以用一个简单的DP解决。只考虑链上边的删除顺序。链顶的边不影响其下的边,它与当前点有贡献当且仅当它最早删,则有 F [ n ] = F [ n − 1 ] × n + ( n − 1 ) ! F[n]=F[n-1]\times n+(n-1)! F[n]=F[n−1]×n+(n−1)! 。再算上其他边的排列方式就行。
也可以这样想:若边A与当前点间有x-1条边,则它与当前点有贡献的概率为 1 x \large \frac{1}{x} x1。最原始的想法或许也会很简单。
T3—11.25A.stone(树与 虚树)
【题目描述】
给你一棵 n 个结点的有根树,树的根为 1。一共有 q 次操作,第 i 次操作选定 k i k_i ki个点 p 1 , p 2 , . . . , p k i p_1,p_2,...,p_{k_i} p1,p2,...,pki,对每个点 x 定义: f x , i = max j = 1 k i { d i s t ( x , p j ) } f_{x,i}=\max_{j=1}^{k_i}\lbrace dist(x,p_j)\rbrace fx,i=maxj=1ki{dist(x,pj)},其中 dist(x, y) 表示树上 x, y 两点间最短路经过的边数。再对每个点 x 定义 g x = min i = 1 q { f x , i } g_x=\min_{i=1}^{q}\lbrace f_{x,i}\rbrace gx=mini=1q{fx,i},对于每个点你需要求出 g x g_x gx。
1 ≤ n , q ≤ 3 × 1 0 5 , ∑ k i ≤ 1 0 6 1\leq n,q\leq 3\times 10^5,\sum k_i\leq 10^6 1≤n,q≤3×105,∑ki≤106
Review
f 和 g 看起来不太好直接合并,考虑 f 的贡献怎么计算。发现每个点的贡献与每次操作的点集在树上的相对位置有一定联系。可以考虑虚树来帮助理解了。
若确定了虚树上某点到其它点的最长链,那么除此点到最长链方向上的整个子树的点都可以被该最长链贡献。至此,可以通过标记处理+依据dfs序的线段树来处理答案,但实现较为复杂。
进一步想,其实贡献的链就是直径中点延伸出的。那么每次“操作”,先选两个点,再依次拿出点求距离(log n),然后留下最距离长的两点,就有了直径;倍增中点(也可以离线O(n))。在中点打上标记(链长),最后一遍DP就可以求出答案。
利用虚树帮助思考/处理 树上性质或转化仔细分析。