首页 > 其他分享 >点分树

点分树

时间:2023-12-20 11:57:17浏览次数:12  
标签:sz return struct int void 点分树

struct BIT{
	int sz;
	vector<int> c;
	void build(int s){
		c.resize(s+1);
		sz=s;
	}
	int lowbit(int x){
		return x&(-x);
	}
	void add(int x,int y){
		x++;
		for(;x<=sz;x+=lowbit(x)) c[x]+=y;
	}
	int sum(int x){
		x++;
		int ans=0;x=min(x,sz);
		for(;x;x-=lowbit(x)) ans+=c[x];
		return ans;
	}
};
struct DFS{
	int sz[N],mxs[N],ct[N],fu[N];
	BIT c1[N],c2[N];
	int gt_rt(int x,int fa,int st){
		int q=x;
		mxs[x]=max(mxs[x],sz[st]-sz[x]);
		for(int i=h[x];i;i=d[i].n){
			int y=d[i].b;
			if(ct[y]||y==fa) continue;
			int p=gt_rt(y,x,st);
			if(mxs[p]<mxs[q]) q=p;
		}
		return q;
	}
	void dfs(int x,int fa){
		sz[x]=1,mxs[x]=0;
		for(int i=h[x];i;i=d[i].n){
			int y=d[i].b;
			if(y==fa||ct[y]) continue;
			dfs(y,x);
			sz[x]+=sz[y],mxs[x]=max(mxs[x],sz[y]);
		}
	}
	void build(int x){
		ct[x]=1,sz[x]++;
		c1[x].build(sz[x]),c2[x].build(sz[x]);
		for(int i=h[x];i;i=d[i].n){
			int y=d[i].b;
			if(ct[y]) continue;
			dfs(y,x);
			int rt=gt_rt(y,x,y);
			fu[rt]=x,sz[rt]=sz[y];build(rt);
		}
	}
	void pre(){
		mxs[0]=1e9;
		memset(ct,0,sizeof(ct));
		memset(fu,0,sizeof(fu));
		dfs(1,0);
		int rt=gt_rt(1,0,1);
		build(rt);
	}
	void jia(int x,int y){
		for(int i=x;i;i=fu[i]) c1[i].add(Tl.dis(x,i),y);
		for(int i=x;fu[i];i=fu[i]) c2[i].add(Tl.dis(x,fu[i]),y);
	}
	int he(int x,int y){
		int ans=c1[x].sum(y);
		for(int i=x;fu[i];i=fu[i]){
			int z=y-Tl.dis(x,fu[i]); 
			if(z<0) continue;
			ans+=c1[fu[i]].sum(z)-c2[i].sum(z);
		}
		return ans;
	}
}T;

标签:sz,return,struct,int,void,点分树
From: https://www.cnblogs.com/hubingshan/p/17916206.html

相关文章

  • <学习笔记> 点分树
    感觉可以理解为带修点分治。常用于解决与树原形态无关的带修改问题。——oi-wiki点分树是通过更改原树形态使树的层数变为稳定\(\logn\)的一种重构树。就是通过点分治找重心的方式,将这一层重心为上一层重心的儿子。所以对于很多暴力的复杂度是正确的。一开始发现建树错了......
  • 点分树(动态点分治) 学习笔记
    模板题题目传送门给定一棵树(带点权),支持以下操作:修改点权。查询到一个点距离\(\lek\)的点的权值和。\(n,T\le10^5\)算法解析前置知识:点分治我们考虑把每次求出的重心和上一层的重心连边,我们就可以得到点分树。这棵树有以下性质:树高为\(\logn\),也就是暴力找LCA的......
  • 点分树【产品说明书】
    氡态淀粉质or淀粉素产品用途本章讲解本产品的用途,即大规模处理带修改的树上路径。本产品是点分治的进阶版,故而又名“动态点分治算法”。使用方法前置芝士点分治,请看上一篇博客。点分治利用了重心的特质,使得分治不会超过\(\log{n}\)层。这一点不论过去还是现在都很重要(用......
  • 浅谈 树上带权最长最短路径,决策包容性与点分树
    树上带权最长最短路径,决策包容性与点分树\(\text{preface}\)最近学习了点分树相关的内容,也碰巧见识到了许多……树上路径问题(非负权),最长或是最短,有的可以用点分治(树)解决,有的可以用线段树解决,有的需要深层次挖掘性质,就在这里做一个小小地总结了一些另类的方法。1.树上带权最长......
  • 【YBT2023寒假Day10 C】娄居吉勾(点分树)
    娄居吉勾题目链接:YBT2023寒假Day10C题目大意有一个n个点m条边的无向连通图,每个点至多在k个简单环上。然后有q个操作,标记一个没有标记过的点,或者给你一个点求......
  • 点分树
    一种用来解决一类与树的形态无关的问题。首先需要知道点分治。然后点分树就是把点分治过程变成一棵重构树。一个点的儿子就是下一层分治中选择的重心。容易发现点分树的......
  • 点分树
    黄昏夕阳,铺一片余晖锦缎,远处炊烟袅袅,我们活在这美好温暖的人间。本文是基于辰星凌的博客QAQ大佬的博客的自己的一些“摘抄”和自己的一些想法点分治的核心思想在于依据......
  • 点分治与点分树
    点分治和点分树真的是各种意义上的好东西。不仅好玩,而且写完一看自己的代码5.几kb:“wc我今天搞了好多学习”。在做关于树的题时,我们会遇到一类题型:题目跟路径有关,你找到......
  • 动态点分治(点分树)
    点分树(动态点分治)点分治的核心思想在于依据重心划分子连通块,其良好的性质保证了最多只会分治logn层。有了这一特性,便可使用各种暴力计算答案。那么我们按照分治递归的......