首页 > 其他分享 >CF1881F Minimum Maximum Distance

CF1881F Minimum Maximum Distance

时间:2023-10-13 11:12:17浏览次数:30  
标签:Distance right 复杂度 Maximum fa Minimum 子树外 mathcal 转移

给定一棵树,树上的一些点被打上了标记,定义一个节点的贡献为其到所有标记节点距离的最大值,求最小贡献。
\(n \le 2 \times 10^5\)。

这道题的原题是 CF337D(甚至要更困难一些)。

很套路的换根 DP 啊。我们考虑设 \(f_i\) 为 \(i\) 子树内的标记节点到 \(i\) 的最大距离,\(g_i\) 为子树外到 \(i\) 的最大距离。首先,\(f\) 的转移是显然的:

\[f_i = \max_{j \in \operatorname{subtree}(i)} \left\{ f_j + 1 \right\} \]

直接从子树中转移,取最大值即可。

再来考虑 \(g\) 的转移。我们设 \(fa_i\) 为 \(i\) 的父亲,那么 \(i\) 子树外的点可划分为两个部分:\(fa_i\) 子树外的点与 \(fa_i\) 子树中去掉 \(i\) 的子树的部分。其中 \(fa_i\) 子树外的点的贡献显然就是 \(g_{fa_i} + 1\),而剩余部分的贡献也不难看出是其子树内部的最大距离再加上它与 \(i\) 的距离,后者显然为 \(2\)。

那么可以得到 \(g\) 的转移方程:

\[g_i = \max \left\{ g_{fa_i} + 1, \max_{j \in \operatorname{subtree}(fa_i) \land j \not= i} \left\{ f_j + 2 \right\} \right\} \]

最后是一些转移方面的问题。对于 \(f\) 那没有什么好说的,直接自底向上转移就完事了。对于 \(g\),一种朴素的转移方法是直接枚举 \(fa_i\) 的所有儿子然后转移,但是这样转移的复杂度是不对的,考虑一个菊花图,那么我们会发现每个点被枚举到的次数为 \(\mathcal{O}(n)\) 的,那么总的时间复杂度会变成 \(\mathcal{O}(n^2)\),这当然无法接受。一种更聪明的转移方法是在计算 \(f\) 时同时记录下每个点 \(f\) 最大与次大的儿子,那么在转移 \(g\) 时,如果当前点是其父亲的最大的儿子,我们就从次大的儿子转移,否则就从最大的儿子转移,这样转移就是 \(\mathcal{O}(1)\) 的了。

当然,这个题的初始化也要小心,要注意特别考虑被标记的点。那么总体的时空复杂度都为 \(\mathcal{O}(n)\)。

由于比赛没有打,所以代码也没写。不过实现方面也没有什么难度,相信聪明的你一定能写出来的。

标签:Distance,right,复杂度,Maximum,fa,Minimum,子树外,mathcal,转移
From: https://www.cnblogs.com/forgot-dream/p/17761619.html

相关文章

  • [AGC030F] Permutation and Minimum 题解
    PermutationandMinimum看到300的数据范围,再加上计数题,很容易就往计数DP方向去想。为方便,我们将\(n\)乘二。因为是两个位置取\(\min\),于是我们便想到从小往大把每个数填入序列。于是DP数组第一维的意义便出来了:当前已经填入了前\(i\)小个数。考虑当前填入一个数。这......
  • Maximums and Minimums (CF E)
      思路:分别求出最小区间和最大区间,利用单调zai处理即可然后在利用调和级数,求最小值的倍数 后记:为什么我不2个元素都求一个区间呢?......
  • excel 导出 The maximum length of cell contents (text) is 32767 characters Excel
    excel导出Themaximumlengthofcellcontents(text)is32767characters导出excel功能,报错。错误日志提示::Themaximumlengthofcellcontents(text)is32767characters调查后,poi会有单元格最大长度校验超过32767会报错。需求调研:调研发现,excel和csv文件本身存在......
  • [ARC130E] Increasing Minimumm
    [ARC130E]IncreasingMinimumm?考虑模拟一下题目中的过程,发现相当于将原序列按照初始值划分为若干个等价类,然后每次都会先合并等价类然后重排等价类中的所有数并加入\(I\)中。这样将\(I\)划分成了若干段。考虑假设我们一共划分出\(T\)个段,那么最终每个数的答案就是\(T\)......
  • System.NotSupportedException:“无法显式设置 SplitterPanel 的高度。改在 SplitCont
    System.NotSupportedException:“无法显式设置SplitterPanel的高度。改在SplitContainer上设置SplitterDistance。”这个错误信息是在使用SplitContainer控件时出现的。它表明您尝试显式设置SplitterPanel的高度,但这是不支持的操作,应该在SplitContainer上设置Splitte......
  • CF1857B Maximum Rounding
    题目大意给定一个自然数\(n\),可以对任意一位进行四舍五入,可以进行任意次,求能得到的最大数。\(n\)的长度不超过\(2\times10^5\),没有前导零。solution首先,选择四舍五入的数一定\(\ge5\),不然对答案没有贡献。其次,高位的数可能会受到低位的进位,这启发我们从低位向高位考虑......
  • 【线段树合并】CF1805E There Should Be a Lot of Maximums 题解
    CF1805E待补:有另解看到维护树上问题,可以想到线段树合并。但直接维护显然不行,要一点技巧。发现\(val\)的出现次数\(cnt_{val}\)如果\(\ge3\),那么一定是一个候选项,若\(cnt_{val}=1\),那么一定不能作为候选项。于是可以用权值线段树维护对于\(val\)有\(cnt_{val}=......
  • C. Assembly via Minimums
    C.AssemblyviaMinimums找规律首先根据题意,B组数据的顺序是完全没有关系的,因为可以随意打乱,所以a组的值一定在b组里找,这不是废话。其次我们观察数据可知,最小值出现的次数是n-1,比较好理解的方法是:分别把最小值放在开头和结尾,因为要取最小值所以在B组出现的次数一定是n-1。接......
  • [CF762D] Maximum path 题解
    [CF762D]Maximumpath题解想法首先考虑问题的弱化版,如果不能往左走,能取到的最大值是多少。这个问题可以用一个显然的DP解决,\(f_{i,j}\)表示走到第\(i\)列,第\(j\)行,并且不会再访问这一列其它的方格,能取到的最大值。转移可以从三个方向考虑,以\(f_{i,1}\)为例,黑色是当......
  • nginx访问报错“maximum number of descriptors supported by select() is 1024 while
    1、问题背景 项目:一个人力的系统,主要用于考勤打卡环境:windowsservernginx版本:1.22 问题说明:当早上访问人数增加的时候,就会出现nginx的异常nginx的后台报错日志:maximumnumberofdescriptorssupportedbyselect()is1024whileconnectingtoupstream  ......