11月 树上问题汇

树上问题汇(近期)

T1—11.24A.path(树与 森林 DP)

【题目描述】

给定一张 n 个点,m 条边的无向无环带权图。

对于一个非空点集 A,如果存在一条简单路径经过点集内的所有点,则称它是好的,并设
f(A) 表示边权和最大的经过 A 中所有点的简单路径的边权和

从所有好的点集中随机抽取一个点集 A,求 f(A) 的期望模 998244353 的值。

n ≤ 1 0 6 n\leq10^6 n106

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 n2×106

Review

子树大小不太好算。但我们只算代价总和,所以,

由于期望的线性性,我们考虑每个点作为子树中的点产生的贡献,

这样就相当于计算每个点被其上的链上的边计算的次数了,子树问题转为链上问题!

可以用一个简单的DP解决。只考虑链上边的删除顺序。链顶的边不影响其下的边,它与当前点有贡献当且仅当它最早删,则有 F [ n ] = F [ n − 1 ] × n + ( n − 1 ) ! F[n]=F[n-1]\times n+(n-1)! F[n]=F[n1]×n+(n1)! 。再算上其他边的排列方式就行。

也可以这样想:若边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 1n,q3×105,ki106

Review

f 和 g 看起来不太好直接合并,考虑 f 的贡献怎么计算。发现每个点的贡献与每次操作的点集在树上的相对位置有一定联系。可以考虑虚树来帮助理解了。

若确定了虚树上某点到其它点的最长链,那么除此点到最长链方向上的整个子树的点都可以被该最长链贡献。至此,可以通过标记处理+依据dfs序的线段树来处理答案,但实现较为复杂。

进一步想,其实贡献的链就是直径中点延伸出的。那么每次“操作”,先选两个点,再依次拿出点求距离(log n),然后留下最距离长的两点,就有了直径;倍增中点(也可以离线O(n))。在中点打上标记(链长),最后一遍DP就可以求出答案。

利用虚树帮助思考/处理。树上性质或转化仔细分析。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页