首页 > 其他分享 >20240806:点分治,虚树选做

20240806:点分治,虚树选做

时间:2024-08-06 13:18:23浏览次数:16  
标签:rt log text 复杂度 分治 棵子 20240806 虚树选 dis

POJ-1741 Tree

题意:给定一棵树,求多少无序对 \((u, v)\) 满足 \(\text{dist}(u, v) \le k\)。

对于树上的路径进行分类:经过根;不经过根。

第二类路径点可以通过递归子树求出。

对于经过根的路径,可以一遍 dfs 求出每个点到根的距离 \(\text{dis}(u)\)。

问题转化为求 \(\text{dis}(u) + \text{dis}(v) \le k\) 且 \(u, v\) 不在同一棵子树的点对数。

如果没有后面子树的限制,可以简单的排序 + 双指针求出,那么只要把每棵子树多算的减掉即可。

单次复杂度 \(O(n\log n)\)。如果直接递归,复杂度高达 \(O(n^2\log n)\)。

考虑 \(rt\) 选取当前树的重心。

\(rt\) 的每棵子树大小不大于 \(n/2\),如果存在子树 \(u\) 大于 \(n/2\),以 \(u\) 为重心不会比 \(rt\) 更劣。

因此每次都选重心,树的大小至少减少一半,最多递归 \(O(\log n)\) 层,每层总结点数 \(O(n)\)。

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

P9678 [ICPC2022 Jinan R] Tree Distance

题意:

标签:rt,log,text,复杂度,分治,棵子,20240806,虚树选,dis
From: https://www.cnblogs.com/Luxinze/p/18344945

相关文章

  • CDQ分治
    CDQ分治CDQ分治是一种思想而不是具体的算法,与动态规划类似。目前这个思想的拓展十分广泛,依原理与写法的不同,大致分为三类:解决和点对有关的问题。1D动态规划的优化与转移。通过CDQ分治,将一些动态问题转化为静态问题。解决和点对有关的问题这类问题多数类似于「给定一......
  • 根号分治(待补充)
    最近有根号分治的题都没那么熟悉,想到了方向感也很差,故写一点题解。LCA查询看到题目中的条件\(\sumk\le10^5\)说明\(k\leS\)的个数很多,\(S\lek\)的个数很少。那么对于前者,考虑一开始最朴素的\(O(S^2)\)的暴力,枚举集合中的两个点,求\(LCA\)总时间复杂度\(O(\fra......
  • 「Day 2—贪心问题&分治&前缀和」
    贪心问题定义顾名思义,越贪越好。。。习题P1094[NOIP2007普及组]纪念品分组思路简单来说:最少的+最多的,利用双指针。代码#include<algorithm>#include<iostream>usingnamespacestd;intw,n;intp[30005];intmain(){cin>>w;cin>>n;for(inti=1;i......
  • 边分治维护强连通分量(CF1989F,P5163)
    这里的边分治和树上的点分治边分治不一样,是维护强连通分量用的,每条边有一个出现时间,通过将每条边按连通关系分流重新排列,从而维护每个时间点整张图的连通性。具体的,这个算法是维护这样的一类问题:n个点,m条边按时间顺序依次加入,每加入一条边,你需要回答一些问题,比如在这个时间点......
  • 树分治
    点分治点分治适合处理大规模的树上路径信息问题。LuoguP4178Tree给定一棵有\(n\)个点的带权树,给出\(k\),询问树上距离小于等于\(k\)的点对数量。分治地考虑每一个子树,求出重心,对答案有贡献的是三种点对,依次解决。重心-子树上的点直接累加贡献即可。子树上的点......
  • cdq分治
    cdq分治主要思想为分治,分为三个部分:左区间内部。左区间对右区间。右区间内部。一个保险的标准顺序是先处理左区间,再处理左区间对右区间的贡献,最后处理右区间,这样就可以保证时序性了。注意这种写法在处理左区间对右区间贡献是要先按标号排序分出正确的左右区间,如果是先递归......
  • 解密编程的八大法宝(四)(附二分查找、分治法和图论算法(深度和广度优先搜索、最短路径、最
    算法题中常见的几大解题方法有以下几种::暴力枚举法(BruteForce):这是最基本的解题方法,直接尝试所有可能的组合或排列来找到答案。这种方法适用于问题规模较小的情况,但在大多数情况下效率不高。贪心算法(GreedyAlgorithm):贪心算法在每一步都选择当前看起来最优的解,希望最终能......
  • 点分治板子
    #define_CRT_SECURE_NO_WARNINGS#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>#include<stdlib.h>#inc......
  • 线段树分治小结
    一般来说,这种题目是给定一些信息,比如说边,然后这些信息会在一个时间段内出现。一般来说需要离线,然后建立一棵以维护每个时刻信息的线段树,具体来说就是在每个节点维护一个vector。#121.「离线可过」动态图连通性以经典例题来说,我们根据每条边出现的时刻将它插入到线段树上对应时......
  • 树分治、动态树分治学习笔记
    点分治点分治适合处理大规模的树上路径信息问题,选取重心,将当前的树拆分为几颗子树,然后递归子树求解问题,但是今天的重点不在这里边分治与点分治类似,选取一条边,均匀地将树分成两个部分,但是对于一个点有多个儿子时,时间复杂度就会非常大,于是我们可以将其转化,这里有两种方法\(1.\)......