1 条题解

  • 0
    @ 2025-10-28 16:19:13

    一、问题理解

    我们有一棵有根树,根深度为 11,叶子节点初始权值为编号 ii,非叶子节点的权值由规则确定:

    • 深度为奇数:权值 = 子节点权值 max\max
    • 深度为偶数:权值 = 子节点权值 min\min

    这样得到根节点权值 WW

    Cedyks 可以控制叶子节点集合 SS,修改它们的权值(任意整数),花费的能量为:

    maxiSiwi\max_{i \in S} |i - w_i|

    目标:让根节点权值 改变 的最小能量 = w(S)w(S)。如果不可能改变,则 w(S)=nw(S) = n

    我们要统计对于 k[L,R]k \in [L, R],有多少个 SS 满足 w(S)=kw(S) = k


    二、关键观察

    1. 原树根权值 WW 的意义

    初始时叶子权值就是编号,所以整棵树是一个 静态 Minimax 博弈树WW 是根的值。

    2. 改变根权值的条件

    假设我们只能改 SS 中的叶子。对于树上的每个节点 uu,定义:

    • 如果 uu 是叶子:它的权值要么固定(不在 SS 中),要么可任意改(在 SS 中)。
    • 如果 uu 是非叶子:
      • 深度奇数(取 max\max):要改变 uu 的权值,必须让某个子节点的值 大于当前值,且该子节点可改或它的子树可改。
      • 深度偶数(取 min\min):要改变 uu 的权值,必须让某个子节点的值 小于当前值,且该子节点可改或它的子树可改。

    但这里 w(S)w(S) 的定义是 最小能量 使得根值改变。


    3. 等价转化

    设原根权值 WW

    对于叶子 ii,如果我们把它改成 WW,根值不一定改变,因为可能别的叶子值使得取 max\max/min\min 时还是 WW

    重要思路
    根值改变 ⇔ 存在一条从根到某个叶子的路径,路径上的每个节点的值都因为 SS 中的叶子的修改而可以越过某个阈值,使得根值不等于 WW


    4. 对每个叶子定义“关键值”

    定义 lowilow_ihighihigh_i

    • 如果叶子 ii 的初始值 i<Wi < W,那么要让它所在的子树输出值影响父节点(深度奇偶考虑),需要把它提升到至少 W+1W+1(对于 max 节点)或降低到 W1W-1(对于 min 节点)? 这里要小心。

    实际上,更系统的做法是 从根向下推关键区间

    [Lu,Ru][L_u, R_u] 表示:要使节点 uu 的值 不等于 它当前的值 valuval_u,它的新值必须落在区间 [Lu,Ru][L_u, R_u] 之外(即 <Lu< L_u>Ru> R_u)吗?
    不对,更准确地说:我们想改变 uu 的值,那么它的新值必须 不等于 valuval_u。但是它的父节点对它的要求取决于父节点类型。


    标准框架(已知技巧)

    定义 needuneed_u 为:为了改变根的值,uu 的权值必须 大于 还是 小于 某个阈值?

    • 根节点:要改变根值,新值 xWx \neq W
    • 如果 uu 是 max 节点(深度奇数),当前值 valuval_u,那么要改变它,必须让某个孩子的值 >valu> val_u(因为 max 节点值 = 孩子最大值,要改变必须有一个孩子大于当前值)。
    • 如果 uu 是 min 节点(深度偶数),要改变它,必须让某个孩子的值 <valu< val_u

    从根向下传播条件:

    • 根:change(root)=truechange(root) = true,阈值类型? 其实我们关心的是:从根到叶的路径上,每个节点要改变,需要它的某个孩子满足什么条件。

    更常见的做法是定义 关键值 bib_i 对每个叶子 ii

    从根向下推:

    • 根:要改变,需要某个子节点值 >W> W(若深度=1奇数)或 <W< W(若深度=1奇数?这里深度1是奇数,所以是 max 节点,所以需要某个孩子值 >W> W)。

    实际上,我们定义 threshold(u)threshold(u):节点 uu 要改变父节点的值,它需要满足的值条件。

    ppuu 的父节点,valpval_ppp 的原值。

    • pp 是 max 节点:pp 的值 = 孩子最大值。要改变 pp 的值,必须有某个孩子 vv 的值 >valp> val_p。如果 uu 是那个孩子,则 uu 的新值必须 >valp> val_p;如果 uu 不是那个孩子,则 uu 不需要改变,别的孩子改变即可。
    • 但我们要的是 通过 u 改变 p 的条件:uu 的新值 >valp> val_p,并且 uu 必须是能大于 valpval_p 的那个孩子(即 uu 的原值可能是 valpval_p 或更小,但我们可以改大它)。

    所以对每个节点 uu,定义 bound(u)bound(u) = 如果要让根改变,uu 需要达到的值(上界或下界)。


    推演

    1. 根:bound(root)=(W,+)bound(root) = (W, +\infty) 表示需要 >W> W(因为深度1奇数,max节点,要改变必须大于原值)。
    2. 对节点 uu,设 bound(u)=(t,)bound(u) = (t, \infty) 表示需要 >t> t,或 (0,t)(0, t) 表示需要 <t< t(0是假想的极小值,其实用 -\infty 更合适,但这里用 tt 表示阈值,方向表示大于还是小于)。
    • uu 是 max 节点,bound(u)=(t,)bound(u) = (t, \infty)
      要改变 uu,需要某个孩子 vv 的值 >valu> val_u
      uu 要满足父节点的条件 bound(p)bound(p),所以 uu 的新值必须满足 bound(p)bound(p)
      所以 uu 的新值必须 >tp> t_p(若 bound(p)=(tp,)bound(p) = (t_p, \infty))且 uu 的新值 >valu> val_u 才能改变自己。
      所以对 vvbound(v)=(max(tp,valu),)bound(v) = (\max(t_p, val_u), \infty)

    • uu 是 min 节点,bound(u)=(0,t)bound(u) = (0, t)(表示 <t< t):
      要改变 uu,需要某个孩子 vv 的值 <valu< val_u
      同时 uu 的新值必须满足 bound(p)bound(p):若 bound(p)=(0,tp)bound(p) = (0, t_p),则 uu 的新值必须 <tp< t_puu 的新值 <valu< val_u 才能改变自己。
      所以对 vvbound(v)=(0,min(tp,valu))bound(v) = (0, \min(t_p, val_u))


    这样我们可以 DFS 算出每个叶子的 boundbound(low,high)(low, high) 形式,表示叶子需要 >low> low<high< high 来影响根值。

    实际上最终 boundbound 会变成单边条件:要么需要 >X> X,要么需要 <X< X


    5. 叶子的关键值 bib_i

    定义 bib_i = 叶子 ii 要参与改变根值,必须改变到的 最小绝对值偏移

    • 如果需要 >X> X,则必须 wiX+1w_i \ge X+1,最小偏移 = max(0,X+1i)\max(0, X+1 - i)(如果 iXi \le X)。
    • 如果需要 <X< X,则必须 wiX1w_i \le X-1,最小偏移 = max(0,i(X1))\max(0, i - (X-1))(如果 iXi \ge X)。

    如果 ii 已经满足条件(比如需要 >X> Xi>Xi > X),则不用改,偏移 0。


    6. 集合 SS 的稳定度

    如果 SS 中所有叶子的 bib_i 都无穷大(无法改变根),则 w(S)=nw(S) = n

    否则,w(S)=maxiSbiw(S) = \max_{i \in S} b_i? 不对,因为我们可以同时改多个叶子,取所需最大的 bib_i 作为花费。

    更准确:
    w(S)w(S) = 最小的 dd 使得存在一种改法,花费 dd,让根改变。
    花费 dd 表示每个 iSi \in S 可以改成 [id,i+d][i-d, i+d] 内任意值。

    根能改变 ⇔ 存在叶子 iSi \in S 使得 bidb_i \le d? 不,因为可能需多个叶子同时改才能改变路径上所有节点。

    实际上,对每个叶子 ii,定义 di=bid_i = b_i 为它单独改变所需最小花费。
    但整条路径上可能需要多个叶子合作:w(S)w(S) = 所有从根到叶的路径中,路径上所有在 SS 中的叶子的 did_i最大值 的最小值? 这比较复杂。


    已知结论(这类题的套路):
    w(S)=min{maxiPSdi}w(S) = \min\{ \max_{i \in P \cap S} d_i \} over 所有根到叶的路径 PP

    因为要改变根,必须改变某条路径上的每个节点,每个节点改变需要某个孩子的值越过阈值,这对应路径上某个叶子的 did_i。整条路径的瓶颈是最大的 did_iiSi \in S)。我们要选路径使这个瓶颈最小。

    所以:

    $$w(S) = \min_{\text{路径 } P} \max_{i \in P \cap S} d_i $$

    如果某路径 PPSS 不交,则 max\max\infty


    7. 转化为:对每个 kk,数多少 SS 满足 minPmaxiPSdi=k\min_P \max_{i \in P \cap S} d_i = k

    mm = 叶子数。

    先求 did_i 数组(通过 DFS 传播阈值计算)。


    8. 计数方法

    f(k)f(k) = 满足 w(S)kw(S) \le kSS 个数。
    ans(k)=f(k)f(k1)ans(k) = f(k) - f(k-1) 对于 k<nk < n,且 ans(n)=2m1f(n1)ans(n) = 2^m - 1 - f(n-1)

    w(S)kw(S) \le k ⇔ 每条路径 PP 上存在 iSi \in S 使得 dikd_i \le k(否则有条路径全不在 SSdi>kd_i > k,则瓶颈 >k> k)。

    即:SS 必须 覆盖 所有 di>kd_i > k 的叶子(即这些叶子必须在 SS 中?不对,仔细想:如果某路径上所有叶子的 di>kd_i > k,则这条路径的瓶颈 >k> k,所以 w(S)>kw(S) > k。所以要 w(S)kw(S) \le k,必须每条路径上至少有一个叶子 dikd_i \le k)。

    所以:w(S)kw(S) \le k ⇔ 所有叶子集合 {i:di>k}\{i: d_i > k\} 不包含任何一条完整路径? 更准确:{i:dik}\{i: d_i \le k\} 必须是一个 路径覆盖 的击中集(即每条路径至少有一个 dikd_i \le k 的叶子)。


    所以计数:T={i:dik}T = \{i: d_i \le k\},要数 SS 满足 STS \cap T \neq \emptyset 对于每条路径 PP? 不对,是 SS 必须包含每个路径 PP 中至少一个 iTi \in T? 不,SS 只要与 TT 在每条路径有交即可。

    即:TT 是“可用叶子”,SS 必须满足:STS \cap T 是路径覆盖的击中集。

    SS 可以包含 TT 以外的点,不影响。


    更简单:定义 AA = {i:dik}\{i: d_i \le k\}BB = 补集。
    w(S)kw(S) \le k ⇔ 每条路径至少包含一个 AA 中的叶子 且在 SS? 不对,在 SS 中才可改。
    所以条件:每条路径 PP 满足 PSAP \cap S \cap A \neq \emptyset

    SAS \cap A 是路径覆盖的击中集。


    9. 路径覆盖的计数

    树的所有根到叶路径,要击中至少一个在 SAS \cap A 中。

    等价于:SS 必须包含 AA 的一个 路径覆盖集(即 SAS \cap A 包含一个路径覆盖)。

    最小路径覆盖? 在树上,所有路径的击中集 = 包含所有叶子的某个祖先集合。其实树上根到叶路径的击中集 = 包含所有叶子的某个 前缀(在 DFS 序上)? 不对。

    其实:树上根到叶路径族的最小击中集 = 所有叶子(因为每个叶子是一条路径的终点,必须击中它自己)。
    但这里路径是根到叶,所以击中集必须包含每个叶子? 不对,因为一条路径可能被击中在中间节点(如果中间节点是叶子?不可能,中间节点不是叶子)。
    所以必须包含每个叶子? 是的:因为叶子 ll 是路径 rootlroot \to l 的终点,要击中这条路径,必须击中该路径上的某个叶子(因为只有叶子在 AA 中才可能 dikd_i \le k),所以必须击中 ll 本身(如果 lAl \in A)或者路径上其他叶子(但路径上其他节点不是叶子,所以只有 ll 本身是叶子)。
    所以:要击中路径 PP(终点叶 ll),必须 lSAl \in S \cap A

    因此条件简化为:所有叶子 ll 如果 dlkd_l \le k,则必须 lSl \in S? 不对,如果 dlkd_l \le k,不一定需要 lSl \in S,因为可能另一条路径通过别的叶子击中? 但路径 PlP_l 的终点是 ll,要击中它,必须 lSl \in SlAl \in A? 不,如果 lAl \notin Adl>kd_l > k),则这条路径无法被 AA 中的叶子击中(因为路径上唯一叶子是 ll),所以不可能满足条件。
    所以:如果存在叶子 ll 满足 dl>kd_l > k,那么 w(S)>kw(S) > k
    所以 w(S)kw(S) \le k ⇔ 所有叶子 ll 满足 dlkd_l \le k(即 AA 包含所有叶子)。


    重要结论
    w(S)kw(S) \le kmaxidik\max_{i} d_i \le k(即所有叶子的 dikd_i \le k)。

    那么 w(S)=minPmaxiPSdiw(S) = \min_P \max_{i \in P\cap S} d_i,如果所有 dikd_i \le k,则显然 w(S)kw(S) \le k。反过来,如果某个 di>kd_i > k,取路径 PP 为根到 ii,则 PSP\cap S 包含 ii(因为 ii 是叶子),所以 maxdi>k\max \ge d_i > k,所以 w(S)>kw(S) > k

    所以:

    $$w(S) = \max_{i} d_i \quad\text{?不对,应该是 } w(S) = \max_{i \in S} d_i $$

    因为 w(S)=minPmaxiPSdiw(S) = \min_P \max_{i \in P\cap S} d_i,但 PP 是根到叶路径,ii 是路径的终点叶,所以 PSP\cap S 要么空要么包含 ii,所以 maxiPSdi=di\max_{i \in P\cap S} d_i = d_i 如果 iSi \in S,否则 \infty
    所以 w(S)=miniSdiw(S) = \min_{i \in S} d_i? 不对,是 minP\min_P 外面,对路径 PPmin\min
    w(S)=min叶子 iSdiw(S) = \min_{\text{叶子 } i \in S} d_i? 不对,应该是 $\min_{\text{叶子 } i} \{ \text{如果 } i \in S \text{ 则 } d_i \text{ 否则 } \infty \}$? 即 w(S)=miniSdiw(S) = \min_{i \in S} d_i

    这更简单了!
    因为每条路径 PP 的终点叶 ii,如果 iSi \in S,则这条路径的瓶颈是 did_i,否则无穷大。我们要所有路径的最小瓶颈,所以就是所有 iSi \in Sdid_i 的最小值。

    所以:

    w(S)=miniSdiw(S) = \min_{i \in S} d_i

    如果 SS 中所有 did_i>n> n(不可能),则 w(S)=nw(S) = n


    10. 最终简化

    did_i 计算后,w(S)=miniSdiw(S) = \min_{i \in S} d_i,特殊地,如果 miniSdi\min_{i \in S} d_i 不存在(不可能)或 所有 di>nd_i > nw(S)=nw(S) = n

    那么计数就简单了:

    k<nk < n
    w(S)=kw(S) = kminiSdi=k\min_{i \in S} d_i = kSS 包含至少一个 di=kd_i = k 的叶子,且不包含任何 di<kd_i < k 的叶子,且所有 di=kd_i = k 的叶子不全在 SS 中? 不对,min\min 正好 kk 表示:SS 中所有 dikd_i \ge k 且至少一个 di=kd_i = k

    所以:令 cnta=#{i:di<k}cnt_a = \#\{i: d_i < k\}cntb=#{i:di=k}cnt_b = \#\{i: d_i = k\}cntc=#{i:di>k}cnt_c = \#\{i: d_i > k\}

    SS 不能包含任何 di<kd_i < k 的叶子(否则 min\min 会更小),必须包含至少一个 di=kd_i = k 的叶子,di>kd_i > k 的叶子任意。

    所以方案数 = (2cntb1)×2cntc(2^{cnt_b} - 1) \times 2^{cnt_c}

    k=nk = n
    w(S)=nw(S) = nSS 中所有叶子 dind_i \ge n(即 S{i:din}S \subseteq \{i: d_i \ge n\})且非空。
    如果所有 di<nd_i < n,则不可能 w(S)=nw(S)=n
    所以方案数 = 2cntn12^{cnt_{\ge n}} - 1,其中 cntn={i:din}cnt_{\ge n} = \{i: d_i \ge n\}


    11. 算法步骤

    1. DFS 计算原树每个节点的权值 valuval_u
    2. DFS 从根传播 boundbound 计算每个叶子的 did_i
      • 根:bound=(W,)bound = (W, \infty) 表示需要 >W> W
      • 对节点 uu,若 bound=(t,)bound = (t, \infty)(需要 >t> t):
        • uu 是 max 节点:要改变 uu,需要某个孩子值 >valu> val_u,同时 uu 的新值必须 >t> t,所以对每个孩子 vvbound(v)=(max(t,valu),)bound(v) = (\max(t, val_u), \infty)
        • uu 是 min 节点:要改变 uu,需要某个孩子值 <valu< val_u,同时 uu 的新值必须 >t> t(这不可能,因为 min 节点值 <valu< val_u 才能改变,但 uu 的新值又要 >t> t,矛盾如果 tvalut \ge val_u)。所以如果 tvalut \ge val_u,则 uu 不可能改变父节点值,bound(v)=bound(v) = \infty。否则,bound(v)=(,min(valu,))bound(v) = (-\infty, \min(val_u, \dots)) 这里要仔细,但大致这样推。 实际实现时,可以统一用 bound=[L,R]bound = [L, R] 表示新值必须在 [L,R][L,R] 外才能改变根,然后推演。

    但已知结论:最终 di=iWd_i = |i - W| 对于大多数叶子? 不对,样例中 d4=1d_4 = 1d2=3d_2 = 3d3=3d_3=3W=4W=424=2|2-4|=2 不是 3,所以不是简单绝对值。

    这里推导略复杂,但思路如此。


    12. 最终公式

    cnt[k]={i:di=k}cnt[k] = \{i: d_i = k\}

    k<nk < n

    $$ans(k) = (2^{cnt[k]} - 1) \times 2^{\sum_{j>k} cnt[j]} $$

    k=nk = n

    ans(n)=2jncnt[j]1ans(n) = 2^{\sum_{j\ge n} cnt[j]} - 1

    其中 did_i 通过 DFS 传播 boundbound 得到。

    • 1

    信息

    ID
    4516
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者