首页 > 编程语言 >算重学(2) 函数式编程的发扬光大&点分治&边分治

算重学(2) 函数式编程的发扬光大&点分治&边分治

时间:2022-12-16 12:33:58浏览次数:33  
标签:重学 分治 显然 son 调用 solve 答案 发扬光大

引入

首先,一个朴素的想法,如何统计树上点对信息?

定义 solve(x) 表示解决以 \(x\) 为根的树的问题。

显然它的答案为 solve(son_x)+儿子间相互的统计

接下来,你考虑断掉 \(x\) 和它的儿子间的边,你去 solve(son_x) 时就显然指的是解决以 \(son_x\) 为根的树的答案了。

点分治

如何优化?

一个朴素的想法,我第一次调用 solve 的时候可以调用其重心!那么复杂度似乎有一点优化!那么,之后调用 solve 的时候为啥不调用重心呢?

为什么我第一次可以调用重心,因为我只需要统计一棵无根树的答案!

那么在你断边之后,显然形成若干棵无根树,答案独立,因此你统计的和上面是一样的!因此你调用其重心开始也显然是正确的!因为你都断边了,各个问题独立了。

性质:所有的点最后都会被叉。即每个点都会被 solve 到。假设没有,则与该点有边的点都不会被 solve 到,于是所有的点都不会被 solve 到。

关于为什么所有点对都能被统计到。

考虑反证。一次 solve(x) 显然使 x 独立了。根据反证,显然 \((x,y)\) 始终在一个连通块。那么它至少是个路径吧!那么显然这些点都还没被叉,假如还没被叉的话,不满足所有的点最后都会被叉的性质。

边分治

边分治相对于点分治的优势就是每次你只要考虑两个连通块之间的贡献即可,然后之后便断开。

因此,我 solve 的定义我觉得仍然是一样的,即解决某棵树的问题,然后找边,然后解决两部分相互间的问题,然后断开边,形成 2 棵新的独立树。如是解决下去!

好处就是,点分每次可能多个连通块的答案互相算很麻烦,边分一定只有 2 个!

else

包括像记录每次分治中心(点/边)上树后支持动态修改的,点分树之类的。

标签:重学,分治,显然,son,调用,solve,答案,发扬光大
From: https://www.cnblogs.com/xugangfan/p/16987042.html

相关文章

  • 重学c#系列——linq(2) [二十八]
    前言前文提及到了一些基础的linq的基础,那么这一节是一些补充。正文关于一个orderby的问题。比如我们输入两个orderby。这里告诉我们多个orderby是没有意义的,如果多......
  • 计数+分治求海量数据中重复最多的一个
    海量数据中求取出现次数最多的一个:计数法:(一).思想:(1)假设一天之内某个IP访问百度的次数不超过40亿次,则访问次数可以用unsigned表示.用数组统计出每个IP地址出现的次数,即......
  • C++ 不知算法系列之聊聊希尔、归并排序算法中的分治哲学
    1.前言排序算法中,冒泡、插入、选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置。希尔、归并、快速排序算法也可归为同一类,它......
  • 分治法与动态规划的区别
    1.分治法与动态规划主要共同点:二者都是将原问题分而治之,分解成若干个规模较小(小到很容易解决的程序)的子问题,然后将子问题的解合并,形成原问题的解。2.分治法与动态规......
  • 重学c#系列——linq(1) [二十七]
    前言简单介绍一下linq,linq很多人其实用的很熟练了,但是有些人不知道自己用的是linq。正文在介绍linq之前,先介绍一下集合。publicinterfaceICollection<T>:IEnume......
  • 算法-递归&分治
    一、递归0、递归概述为什么要用递归而不用循环:​ 以n的阶乘为例,确实使用循环会更方便,但是使用递归的场景,一般是比较难以确认推导路径的,例如一棵树,要获取所有节点值的和,......
  • 分治法求最大子数组
    最大子数组(分治法)解题思路:将数组分成两份,最大子数组(元素之和最大)只有三种情况:(1)最大子数组在mid左边,即:startIndex和endIndex都在mid左边(2)最大子数组一半在左边,一半在右......
  • CDQ 分治,李超树与斜率优化
    P4027,及一类类似问题:给定\(a_i,b_i,x_i,y_i\),对于每个\(i\)求出\(f_i=\max\limits_{j=1}^{i}\{a_ix_j+b_iy_j\}\)先说一下一类经典问题的做法:给定\(n\)个二......
  • 重学线性基
    关于我暑假学的,但是完全没学。我不会线代,所以有关那个的部分直接跳了。定义关于这是个啥,我只找到一个还算确切的定义对于一个序列\(a_{1\dotsn}\),如果一个序列\(d......
  • HTML重学--基础
    <html>与</html>之间的文本描述网页<body>与</body>之间的文本是可见的页面内容<h1>与</h1>之间的文本被显示为标题<p>与</p>之间的文本被显示为段落<!......