首页 > 其他分享 >树专题训练

树专题训练

时间:2023-08-18 23:11:27浏览次数:52  
标签:le 训练 dfs fib 专题 兔子 权值 节点


核心城市

  • 题目描述:给定一棵树,需选定一个大小为\(k\)的连通块,最小化非连通块的点到连通块的最大距离。其中距离定义为点与连通块中所有点的路径最小值。
  • 数据范围:\(1\le k < n \le 10^5\)。

首先找到树的直径,以其中点为根,这样做的好处是连通块一定是包含根节点的一个连通块,之后直接贪心求解,如果子节点能使答案减小选上即可。

关于树的直径,可以两次dfs找最远点,也可以用树形dp做。

时间复杂度\(O(n)\)。


斐波那契

  • 题目描述:以斐波那契数列的兔子模型,按兔子出生顺序对所有兔子进行编号,若两对兔子同时出生则父母编号小的兔子编号更小。按父子关系连边形成一棵树。现有\(m\)组询问,每次询问两只兔子\(a_i\)和\(b_i\)的最近公共祖先。
  • 数据范围:\(m\le 3\times10^5\),\(a_i,b_i\le10^{12}\)。

根据关系图可以得到一个结论:父亲与儿子节点标号正好相差斐波那契数列中的某值,且这个值是小于儿子节点中最大的那个,下面有一个简单的证明。

在第\(k\)个月后一共有\(fib_k\)只兔子,其中\(fib_{k-1}\)只具有生育能力,将在第\((k+1)\)个月生下\(fib_{k-1}\)只兔子,其编号为\(fib_{k}+1,\cdots,fib_k+fib_{k-1}\),其父亲编号正好是\(1,\cdots,fib_{k-1}\),故得证。

由于\(fib_k > 2fib_{k-2}\),即斐波那契数列是指数级膨胀的,因此树高是\(O(\log v)\)级别的,暴力向上跳找lca即可。

时间复杂度\(O(n\log^2 v)\)。


Blood Cousins

  • 题目描述:给定一颗\(n\)个点的森林,有\(m\)次询问,求出编号为\(v\)的点有多少个\(p\)级表亲。两个点称为\(k\)级表亲当且仅当存在一个点同时是他们的\(k\)级祖先。
  • 数据范围:\(1\le n,m\le 10^5\)。

树上启发式合并(dsu on tree)的模板题。

考虑暴力做法,用dfs统计信息,当dfs到平行的下一课子树时,之前的信息就需要清掉,而当回到父亲节点统计其信息时,又需要将所有子树信息重新加回来,从而造成浪费。但根据这一逻辑,我们发现实际上dfs到的最后一个子树信号是不需要清空的,因此想办法把信息最多的子树(重儿子)最后一个dfs即可。

时间复杂度\(O(n\log n)\)。


高橋君と木のおもちゃ

  • 题目描述:给定一颗有根树,点有点权,有\(m\)个操作,每次给定一个值\(t_i\),可以不操作,也可以任选一点使其到根的路径上所有点权都向上移(即父亲权值变为儿子权值),根节点权值丢掉,同时该点权值变为\(t_i\),求操作后树的最大总权值。
  • 数据范围:\(2\le n \le 5000\),\(1\le m \le5000\)。

首先注意到操作的顺序使不重要的,任意的操作顺序都能得到同样的结果,因此可以贪心地将\(t_i\)从大到小排序,最后肯定取它的一段前缀。

观察题意,发现要舍弃的是包括根节点(即节点1)在内的一个连通块内的权值,那么设\(f_{i,j}\)表示子树\(i\)中舍弃\(j\)个节点的最小权值和,若节点x有一个儿子y,那么有转移方程:

\[f_{x,i+j}=\min_{i=0\sim|x|\\j=0\sim|y|}\{f_{x,i}+f_{y,j}\} \]

这是边dfs边做的,因此可以包含所有子树信息,同时注意需从后往前枚举,防止造成重算,跟01背包倒着枚举同理。

设\(\{T_i\}\)是\(\{t_i\}\)的前缀和,\(S\)为最初点权和,最终答案即为\(\max_{i=0}^n\{S+T_i-f_{1,i}\}\)。

时间复杂度\(O(n^2)\)。

标签:le,训练,dfs,fib,专题,兔子,权值,节点
From: https://www.cnblogs.com/seketsu/p/17641795.html

相关文章

  • 【愚公系列】2023年08月 WPF控件专题 Button控件详解
    (文章目录)前言WPF控件是WindowsPresentationFoundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见......
  • 代码随想里算法训练营第四天|
     24.两两交换链表中的节点题目给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。第一想法第一次做这个题的时候其实没搞懂怎么两两交换,原来是12、34、56这样...应该是反转链表的变体,先判断......
  • 代码随想录算法训练营第六天|242.有效的字母异位词 349. 两个数组的交集 202. 快乐数
     哈希表部分:哈希表,简单来说就是k-v形式查询的结构,用来快速判断一个元素是否出现集合里,如hashmap核心是哈希函数,k存哈希函数的值,找的时候找查询项的哈希函数值就行,返回v 出现哈希碰撞的时候,查找的流程怎么走呢?(*存疑,之后查一下) 类型:数组+集合set(set、multiset、unordered......
  • 代码随想录算法训练营第三天| 203.移除链表元素 ,707.设计链表 ,206.反转链表
    203.移除链表元素题目给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。第一想法定义一个指针a指向头节点,顺序遍历链表,循环结束的条件是指针a.next为null删除操作是判断a.next.val=val时让a.next=a.next.nex......
  • CTFer成长记录——CTF之Web专题·bugku—never_give_up
    一、题目链接https://ctf.bugku.com/challenges/detail/id/88.html二、解法步骤  打开网页,url中看到id=1,修改成2、3、4发现无反应。然后查看网页源代码:,提示一个网址,直接访问看看:发现url跳转到了bugku的论坛:    BP抓1p.html网页的包,在返回包中发现一串密文:  --JTI......
  • CTFer成长记录——CTF之Web专题·buuctf—Cookies
    一、题目链接https://ctf.bugku.com/challenges/detail/id/87.html?id=87&二、解法步骤  打开网页,发现自动给url上了参数:, line的值为空,filename是base64加密格式,解密后为:key.txt。  首先尝试更改line=1,、2、3、4;发现无反应,然后尝试访问用filename访问index.php。因为直......
  • 广东实验中学暑假训练-5
    A题意通过删除一个字符串中的某些元素而不改变其余元素的顺序,可以派生出该字符串的一个子序列。例如,序列BDF是ABCDEF的子序列。字符串的子字符串是该字符串的连续子序列。例如,BCD是ABCDEF的子串。你得到了两个字符串s1,s2和另一个名为virus的字符串。你的任务是找到s1......
  • 8月17日思维训练
    8月17日思维训练CF1545BAquaMoonandChess题目大意:给定一个长度为n的棋盘的状态,位置\(i\)为\(1\)代表该位置有棋子,为\(0\)则说明没有棋子。如果位置\(i+2\)是空的,位置\(i+1\)非空,则位置\(i\)的棋子可以移动到位置\(i+2\),反之,同理。问通过上述操作可以达到的状......
  • 第十节 面向对象综合训练(拓展)
    练习一:​ 自行完成切换美女图片的功能。需求如下:需求详解:1,在功能选项中添加更换图片,在更换图片里面再添加美女,动物,运动。​代码中功能是JMenu,更换图片也是JMenu,美女,动物,运动是三个JMenuItem​代码如下://创建菜单并添加到界面当中//1.创建菜单JMenuBar的对象J......
  • 【分布式技术专题】「分布式ID系列」百度开源的分布式高性能的唯一ID生成器UidGenerat
    推荐超值课程:点击获取UidGenerator是什么UidGenerator是百度开源的一款分布式高性能的唯一ID生成器,更详细的情况可以查看官网集成文档uid-generator是基于Twitter开源的snowflake算法实现的一款唯一主键生成器(数据库表的主键要求全局唯一是相当重要的)。要求java8及以上版本......