首页 > 其他分享 >点分治

点分治

时间:2024-05-01 22:11:07浏览次数:18  
标签:rt fir siz 分治 max now

点分治

本质就是树上的分治。

序列的分治是不断地将序列二分,而对于树则需要利用树的重心。

树的重心

定义:树中一节点,以它为根的最大的子树最小。

求解:跑一遍\(dfs\)求解即可。

void get_rt(int u, int fa){
	siz[u] = 1, max_siz[u] = 0;
	for(auto v : T[u]){
		if(v.fir == fa || vis[v.fir]) continue;
		get_rt(v.fir, u);
		siz[u] += siz[v.fir];
		max_siz[u] = max(max_siz[u], siz[v.fir]);
	}
	max_siz[u] = max(max_siz[u], sum - siz[u]);
	if(max_siz[rt] > max_siz[u]) rt = u;
}

1:初始值\(maxsiz[rt] = INF\),\(maxsiz[rt]\)保存的是最小值。

2:\(maxsiz[u]\)清空。

分治部分

先找到当前树的重心,\(calc\)后把当前重心标记,再递归求解它的所有邻点。

void solve(int now){
	vis[now] = 1;
	clac(now);
	for(auto v : T[now]){
		if(vis[v.fir]) continue;
		sum = siz[v.fir];
		max_siz[rt] = 0x3f3f3f3f;
		get_rt(v.fir, now);
		solve(rt);
	}
}

注:

1:先求解出\(sum, rt\)后再递归\(solve(rt)\)。

2:\(maxsiz[rt] = INF\) 。

3:注意\(vis\)数组。

标签:rt,fir,siz,分治,max,now
From: https://www.cnblogs.com/Peng1984729/p/18169718

相关文章

  • 洛谷2664树上游戏-点分治
    link:https://www.luogu.com.cn/problem/P2664lrb有一棵树,树的每个节点有个颜色。给一个长度为\(n\)的颜色序列,定义\(s(i,j)\)为\(i\)到\(j\)的颜色数量。以及\[sum_i=\sum_{j=1}^ns(i,j)\]现在他想让你求出所有的\(sum_i\)。一个暴力的想法:因为是求和,所以可以拆......
  • cdq分治/逆序对 一点点总结
    cdq分治/逆序对一点点总结归并排序求普通逆序对问题#include<bits/stdc++.h>#defineINinline#defineRregisterintusingnamespacestd;constintN=5e5+5;typedeflonglongll;INintread(){intf=1;charch;while((ch=getchar())<'0'||ch>&#......
  • CDQ分治
    CDQ分治它是一种非常巧妙地方法。用分治的思想处理三维偏序一类的问题:处理的问题如下:模板有$n$个元素,第$i$个元素有$a_i,b_i,c_i$三个属性,设$f(i)$表示满足$a_j\leqa_i$且$b_j\leqb_i$且$c_j\leqc_i$且$j\nei$的\(j\)的数量。对于......
  • CDQ分治学习笔记
    1.简介CDQ分治是一种思想,类似于动态规划,依照原理和写法的不同,大致分为3类:解决与点对相关的问题1D动态规划的优化及转移通过CDQ分治,将一些动态问题转化为静态问题2.解决与点对相关的问题2.1.流程1.找到序列的中点mid2.将所有的点对(i,j)划分为三类a.\(i\lemi......
  • 点分治小记
    点分治是一类高效统计树上路径问题的算法,通过优化递归深度的方法来有效保证时间复杂度。具体操作一般是以下几步:找到当前子树的重心以重心为根计算经过根节点的路径对答案的贡献将根删去并递归处理它的所有子树因为我们每次都以树的重心来作为根节点,递归深度不会超过......
  • P7431【THUPC2017】小 L 的计算题 (牛顿恒等式)(分治NTT)(多项式求逆)题解
    知识点涉及:牛顿恒等式,分治\(NTT\),多项式求逆。这道题有一个推式子之后分治\(NTT+Ln+Exp\)的做法,不过也有一个不用\(Ln+Exp\)的做法(理论常数要小点,实际差不多)。题解:这道题可以牛顿恒等式直接推出一个非常好写的东西。首先看一下牛顿恒等式的描述:对于\(n\)次多项式\(A(......
  • 点分治
    1概念点分治是树分治的一种,主要用于处理树上路径问题。注意这颗树不需要有根,即这是一颗无根树。下面以例题分析点分治的基本思想。2基本思想首先你需要会的前置知识:树的重心。我们来看这样一道例题:【模板】点分治:给出一颗无根树,有边权,询问树上是否存在距离为\(k\)的......
  • 点分树(动态点分治)学习笔记
    1.定义在点分治的基础上加以变化,构造一颗支持快速修改的重构树,称之为点分树2.算法2.1.思路点分治的核心在于通过树的重心来划分联通块,减少合并层数,从而降低时间复杂度所以,我们可以按分治递归的顺序提出一颗树,易知树高至多为logn具体的说,对于每一个找到的重心,将上一次分治......
  • 点分治学习笔记
    前置知识:树的重心对于一颗无根树上的每一个点,计算其所有子树中最大的子节点数,这个值最小的点就是树的重心1.定义点分治,又叫树分治,点分治是一种在树上进行路径静态统计的算法,所谓树上的静态统计,并不是像树剖一样维护路径最值,路径之和一类的统计,点分治的本质其实是将一棵树拆分......
  • #莫队二次离线,根号分治#洛谷 5398 [Ynoi2018] GOSICK
    题目\(m\)组询问求\(\sum_{l\leqi,j\leqr}[a_i\bmoda_j==0],n,m,a_i\leq5\times10^5\)分析设\(f(l,r,x)\)表示\(i或j\in[1,x],i或j\in[l,r]\)时的答案,\(g_x\)表示\([1,x]\)的答案,根号的做法可以通过三秒由于涉及区间内的求值,需要在莫队的基础上二次离线,那......