首页 > 其他分享 >点分治

点分治

时间:2024-04-01 09:00:10浏览次数:11  
标签:sz 子树 重心 int maxs 分治

最近学了点分治,觉得挺厉害的,准备写一下加深印象。
树上的东西都很抽象,所以自然要用抽象的东西来做,就比如点分治,点分治的思路是在当前的子树中找重心,然后用重心做事情,为什么用重心,因为重心可以使得复杂度降到log级别,然后再在这个子树里找你要的东西就行了,因为是每次都会用子树做,所以复杂度是O(nlogn)
以例题为例。
【P3806 【模板】点分治 1 】
题意:找树上距离为k的数
考虑点分治,对于每一个子树,记录它到重心的距离,然后在找距离的过程中去看每次询问的距离有没有相等的,如果有就记录下来,最后输出就好

  • 找重心
    根据定义直接找对于当前点所有的子树中最大的子树节点数最少的就行了。
void zzx(int x, int fa) {
    sz[x] = 1, maxs[x] = 0;
  // sz是当前点的儿子(包含自己)的大小,maxs是它的最大的儿子
    for(int i = head[x]; i; i = e[i].nxt) {
        int to = e[i].to;
        if(fa == to || vis[to]) continue;
		zzx(to, x);
		sz[x] += sz[to];
		maxs[x] = max(maxs[x], sz[to]);
	}
	maxs[x] = max(maxs[x], S - sz[x]);
  //可能反着来他的儿子会更大,所以要加一下这个判断
	if(maxs[x] < maxs[root]) root = x;
  //按照定义找重心
}

别的就按题意写就行

标签:sz,子树,重心,int,maxs,分治
From: https://www.cnblogs.com/roselu/p/18107714

相关文章

  • CF938G-动态连通图最短xor路(线段树分治、并查集、线性基)
    link:https://codeforces.com/contest/938/problem/G[!Description]有一张连通的无向图简单图,三种操作:1、加边\((x,y,d)\)2、删边\((x,y)\)3、询问\(x\toy\)的路径中异或最小的路径(不一定是简单路径)保证每次操作后图是连通的\(1\leqn,m,q\leq2\times10^5\).这......
  • 【博客】CDQ分治
    CDQ分治前言CDQ分治是一种分治CDQ分治是一种特殊的分治思想可以用于跟点对有关的问题还有其他用处......(目前不会)算法流程一般来说,cdq分治是通过如下结构进行分治一共分为三步:找到当前区间\([l,r]\)中点\(mid\)递归处理左右区间\([l,mid]\),\([mid+1,r]\)计算左区间......
  • 介绍分治算法
    分治算法是一种将问题划分成多个更小的子问题,并且分别解决这些子问题的策略。它通常包含三个步骤:分解(Divide):将原始问题划分成若干个更小的子问题。这个步骤可以使用递归实现,每次递归处理的子问题规模都要比原始问题小。解决(Conquer):递归地解决各个子问题,如果问题规模足够小,......
  • 一元三次方程(分治法)
    目录题目描述分治法思想介绍分治思路我的代码总结与展望一元三次方程求解【题目描述】形如:这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在−100至100之间),且根与根之差的绝对值≥1。要求由小到大依次在同一......
  • Java(计算机相关)面试之海量数据问题处理(1)分治/hash/排序
    原文链接:https://blog.csdn.net/a619602087/article/details/130348569面试的时候经常被问到海量数据处理问题,下面我会分期介绍几种海量数据处理的思路还有案例了解了之后面试不用怕了大数据处理思路:分而治之/Hash映射+HashMap统计+堆/快速/归并排序分而治之/hash映射:......
  • 点分治
    点分治是树分治的一种形式,通常用来求满足某种要求的路径数量。引入有\(n\)个数,问是否存在一个\(l,r\)使得区间和为\(k\),强行用分治做,可以将数组分成两半,递归后处理左边\(l\)右边\(r\),然后就用前缀和加\(map\)加归并的并做就可以了。思路可以将这个思路放到树上,分为......
  • chapter8-递归与分治
    1.递归递归,指直接或间接地调用自身,解决此类题目的方法见我之前走台阶的笔记,重点有2个,(1)分析问题,归纳出递归公式;(2)递归出口。就像俄罗斯套娃一样,要让递归调用总体朝向递归出口推进。n的阶乘//递归-n的阶乘2024-03-08#include<iostream>#include<cstdio>usingnamespaces......
  • 【洛谷】求第k小的数字(分治算法)
    题目描述如题所述,找到n个数中第K小的数字。但是不同的是时间复杂度要求为O(n),也就是说基本上所有的排序算法都不能用了。这里适合的算法是分治法,也就是使用快速排序。因为这道题的一个特点是只需要得到第k小的数字,而并没有说要对所有元素进行排序。如果我们把所有小于某个元素......
  • Educational Codeforces Round 162 E 点分治 虚树 树形dp
    传送门给出\(n\le2\cdot10^5\)的一棵树,每个节点有一个颜色。求出路径长度为\(2\)路径首端和尾端拥有相同颜色,且路径上其他点不存在相同颜色的点的路径条数。当时看错题了,把颜色抽出来后没法做了。后来感觉能点分治,然后把题看对了,遂写了一个极其抽象的点分治。除此之外,把某......
  • 点分治学习笔记
    0.前言又称淀粉质。学科营之前赶紧来一波急抓。1.引入我们考虑这样一个问题,对于一棵树,我们求出树上所有路径长度小于等于\(k\)的路径总数。首先不难想到一种\(n^3\)的暴力做法,即枚举两个端点,然后暴力出路径。考虑找路径的时候优化一下,采用倍增或者树链剖分将复杂度变为......