首页 > 其他分享 ><学习笔记> 点分树

<学习笔记> 点分树

时间:2023-11-02 21:47:45浏览次数:37  
标签:重心 int siz 分治 点分树 root mx

感觉可以理解为带修点分治。

常用于解决与树原形态无关的带修改问题。 —— oi-wiki

点分树是通过更改原树形态使树的层数变为稳定 \(\log n\) 的一种重构树。就是通过点分治找重心的方式,将这一层重心为上一层重心的儿子。

所以对于很多暴力的复杂度是正确的。

一开始发现建树错了,然后发现是原先的点分治错了,然后才知道其实错误的求重心也可能会有正确的复杂度

2023NOIP A层联测21 距离

子任务二可以直接拿点分树做,就是对于每个重心维护到这个点距离最近的点的距离。然后查询时就将重心看作 \(lca\),直接暴跳就可以了。

点击查看代码
void find(int x,int f){
    siz[x]=1;
    mx[x]=0;
    for(int i=head[x];i;i=nex[i]){
        int y=ver[i];
        if(y==f || vis[y]) continue; 
        find(y,x);
        siz[x]+=siz[y]; 
        mx[x]=max(mx[x],siz[y]);
    }
    mx[x]=max(mx[x],S-siz[x]);
    if(mx[root]>mx[x]) root=x;
}
void solve(int x){
    vis[x]=1;
    for(int i=head[x];i;i=nex[i]){
        int y=ver[i];
        if(vis[y]) continue;
        S=siz[y],root=0;
        find(y,x);
        fat[root]=x;
        solve(root);
    }
}
int mxxx[N];
void updata(int x){
    for(int i=x;i;i=fat[i]){
        int dis=ask_dist(i,x);
        mxxx[i]=min(mxxx[i],dis);
    }
}
int query(int x){
    int ans=inf;
    for(int i=x;i;i=fat[i]){
        int dis=ask_dist(x,i);
        if(mxxx[i]>(1ll<<50)) continue;
        ans=min(ans,dis+mxxx[i]);
    }
    return ans;
}

然后考虑两对点,做法就是点分治套点分树,对 \(x,a\) 进行点分治,然后将在这一层的操作处理掉,按顺序对 \(y,b\) 进行点分树上的修改和查询。具体就是先建一棵点分树,然后将每个操作压入所有涉及到的分治重心上,这里直接在点分树上跳就可以,可以发现每个操作最多被处理 \(\log n\) 次。复杂度就是 \(O(n \log^2 n)\)

标签:重心,int,siz,分治,点分树,root,mx
From: https://www.cnblogs.com/jinjiaqioi/p/17806380.html

相关文章

  • 点分树(动态点分治) 学习笔记
    模板题题目传送门给定一棵树(带点权),支持以下操作:修改点权。查询到一个点距离\(\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层。有了这一特性,便可使用各种暴力计算答案。那么我们按照分治递归的......