Top Tree大学习

news/2025/10/28 21:16:38/文章来源:https://www.cnblogs.com/CWish/p/19170147

前言

\(Top Tree\) 用来解决 路径查询,动态 \(dp\) 等问题。
信息储存在 中。

簇(\(Cluster\)

树上一个边联通块,可以收缩成一条边,我们成这样的联通子图为
簇上的某些点与其它簇相接,我们称其为簇的 端点
被完全包含在簇中的点,我们称之为 内点
边联通块的边称为 内边

  1. 簇只维护内点和内边的信息。
  2. 簇只有两个端点,两个端点间路径称为 簇路径

对于一棵树,每条边都独立为一个簇,我们称之为 基簇

树收缩

树收缩是 \(Top Tree\) 的核心操作。

\(compress(v)\) 是选择一个度数为 \(2\) 的点 \(v\),将 \(v\)的两条边合并。
\(rake(v)\) 是选择一个度数为 \(1\) 的点 \(v\),将 \(v\) 的边与另一条邻边合并。

最终我们将整棵树收缩为一个簇,我们称之为 根簇

\(Top Tree\)

我们用 \(compress,rake\) 两种操作形成根簇的过程建成一棵 \(Leafy Tree\)
并标记是由哪种操作合并的,以便于对应上传信息。
现在问题在如何高效维护信息,即保证树的高度。

重量平衡静态 \(Top Tree\)

对原树进行重链剖分,将轻儿子 \(rake\) 到重链上,对于剩下的重链 \(compress\) 起来。
我们采用分治 \(rake\)\(compress\) 来平衡深度。
类似全局平衡二叉树的,每次选择带权重心当根递归建树。

\(rake,compress\) 操作至少会有 \(O(\log n)\) 的深度,而非必须的上传会使大小翻倍同样为 \(O(\log n)\),故最多应为 \(3 \log n\),但实际应为 \(2 \log n\),但我不会分析。

参考实现:

IL void pu(int p){cl[p]=(ty[p]?rake:compress)(cl[ls[p]],cl[rs[p]]);}
IL int Link(int x,int y,int k){int p=++cntn;fa[ls[p]=x]=fa[rs[p]=y]=p,ty[p]=k;return pu(p),p;}
int Dac(vector<int> &a,int l,int r,int op){if(l==r)return a[l];int mid=r-1,now=0,sum=0;rpt(i,l,r)sum+=cl[a[i]].siz;rpt(i,l,r-1){now+=cl[a[i]].siz;if(now*2>sum){mid=i;break;}}return Link(Dac(a,l,mid,op),Dac(a,mid+1,r,op),op);
}
void dfs(int u,int pre){siz[u]=1,son[u]=0;for(auto v:e[u])if(v!=pre){dfs(v,u),siz[u]+=siz[v],id[v]=nlf(a[v]);if(siz[v]>siz[son[u]])son[u]=v;}
}
int build(int u,int pre){vector<int> H;if(id[u])H.pb(id[u]);for(;son[u];pre=u,u=son[u]){vector<int> L;for(auto v:e[u])if(v!=pre&&v!=son[u])L.pb(build(v,u));if(L.empty())H.pb(id[son[u]]);else H.pb(Link(id[son[u]],Dac(L,0,L.size()-1,1),1));}return Dac(H,0,H.size()-1,0);
}

例题:

最大带权独立集
对于信息的维护,我们需要考虑两种合并的转移方式。
如维护两个端点的距离,我们有 \(dis{rake(u,v)}=dis_u,dis_{empress(u,v)}=dis_u + dis_v\)

参考实现:

struct info{int f[2][2];info(){rpt(x,0,1)rpt(y,0,1)f[x][y]=-inf;}info(const int &w){f[0][0]=0,f[0][1]=w,f[1][0]=0,f[1][1]=-inf;}IL int gmx()const{int mx=0;rpt(x,0,1)rpt(y,0,1)mx=max(mx,f[x][y]);return mx;}
};
struct clst{info v;int siz;clst():v(info()),siz(0){}clst(const int &w):v(info(w)),siz(1){}
};
IL clst rake(const clst &f,const clst &g){clst h; h.siz=f.siz+g.siz;rpt(x,0,1)rpt(y,0,1)rpt(z,0,1)if(f.v.f[x][y]!=-inf&&g.v.f[x][z]!=-inf)mxup(h.v.f[x][y],f.v.f[x][y]+g.v.f[x][z]);return h;
}
IL clst compress(const clst &f,const clst &g){clst h; h.siz=f.siz+g.siz;rpt(x,0,1)rpt(y,0,1)rpt(z,0,1)if(f.v.f[x][z]!=-inf&&g.v.f[z][y]!=-inf)mxup(h.v.f[x][y],f.v.f[x][z]+g.v.f[z][y]);return h;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乱学点东西目录

这里记录了各种各样的奇奇怪怪的算法/思路/数据结构,好玩! 乱学点东西#1 :二进制警报器可以自由转载

CFS任务的负载均衡(load balance)

前言 我们描述CFS任务负载均衡的系列文章一共三篇,第一篇是框架部分,第二篇描述了task placement和active upmigration两个典型的负载均衡场景。本文是第三篇,主要是分析各种负载均衡的触发和具体的均衡逻辑过程。 …

EVE-NG导入华为等镜像的方法

镜像下载Dynamips:思科设备真实IOS镜像,类似GNS3,电脑CPU利用率非常高。 IOL:IOU模拟器的镜像,基本完全支持思科设备二、三层功能。 QEMU:这已经不是镜像文件,而是KVM虚拟机安装操作系统后生成的磁盘文件,通常…

(简记)一类支配点对解决区间查询问题

前言:最近好像见了挺多这种题,记录一下。 支配点对 我们经常遇到树上或区间上关于 \(x,y\in[l,r]\) 一类的区间统计问题,且通常要求区间内点两两任意匹配并统计总贡献,这个贡献不具有简单可加性。我们往往通过找支…

2025 云斗

10/27 Contest 5 A:小分讨+dp C:发现是所有的数和它的倍数有限制,对于值域 \(n\) 这样的限制也只有 \(\sum\limits_{i=1}^n\frac{n}{i}=n\log n\) 个,考虑如何表示这些限制。 考虑对于限制 u,v,若两点都不是对方的…

c++ ranges随笔

ranges c++20引入,在<ranges>头文件中 建立在 std::algo 和 iterator基础上,并做了进一步的抽象集成 与之前相比更加的 安全、简洁、方便 // ranges concept template <typename T> concept range = req…

qoj14458. 调色滤镜

qoj14458. 调色滤镜 平面 \([1,10^9]\times[1,10^9]\) 上有 \(n\) 个点,点 \(i\) 位于 \((x,y)\),有颜色 \(c_i\in [0,9]\)。 有 \(q\) 次操作,每次对平面上一个矩形范围内的点的颜色作用映射 \(f:[0,9]\rightarrow…

第8天(中等题 不定长滑动窗口、哈希表)

打卡第八天 3道中等题滑动窗口相当于在维护一个队列。右指针的移动可以视作入队,左指针的移动可以视作出队。 熟练度+++ 可以十几分钟独立写出相似题了^O^/ 耗时≈一小时 明天继续

P10259 [COCI 2023/2024 #5] Piratski kod

题链 题意 首先,题目写的很抽象,模拟赛时读了半个小时才读懂 题意概括一下就是枚举长度为k的所有01串 然后对01串进行划分,每遇到两个1就进行一次划分 然后把每段提取出来单独处理 如果把提出来的01串计为\(s[1...r]\)…

巧用 using 作用域(IDisposable)的生命周期包装特性 实现前后置处理

需求:在多个方法前后输出日志 logger.Info("begin"); method(); logger.Info("end");如果需要在方法后输出日志同时加上时长 logger.Info("begin"); var sw= Stopwatch.StartNew(); me…

2025.10.27训练记录

其实是10.28晚上写的。感觉就这个题要记录一下。 上午noip模拟。喜提一道不会。 B 题外话: 7:45 开始考试,广附集训爷大吼一声我做过!声称A完全不可做,但B他场切了。于是我开场看B。 那就看B,7:50闭了一下眼睛,睁…

软考复习总结

距离软考还有不到十天,主要对学习的知识点进行总结回顾(以下知识点无顺序重点): 1.对于尾数用补码进行表示时,要注意如果机器位8位,已知补码包含一位符号位,则补码真值的范围(-2n-1,2n-1 - 1), 则将其转换为…

实用指南:Eclipse 透视图(Perspective)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

? #6

100 + 0 + 80 + 0 = 180, Rank 2/6.2024暑期CSP-S&NOIP模拟赛第8套题⾯ 链接:link 题解:暂无 时间:4h (2025.10.28 14:00~18:00) 题目数:4 难度:A B C D\(\color{#F39C11} 橙\) \(\color{#FFC116} 黄\)*1000 …

鲜花:不会说明你有抑郁症3

这回是广为人知题了。自然数幂和:给定 \(n,k\),求 \(\sum_{i=1}^{n} i^k\),\(n\le 10^{18},k\le 2000\)。本来以为用扰动法求自然数幂和很猎奇,结果一搜出来十来篇博客。唉我还是太菜了。 尝试扰动法处理。 设: \…

算法竞赛知识点速通手册

1. 基础贪心:邻项交换与证明 贪心算法的精髓在于“局部最优”导向“全局最优”。然而,其正确性并非总是显而易见的,需要严谨的数学证明。邻项交换(Exchange Argument)是证明一类排序相关贪心策略最经典、最强大的…

集训做题杂记1 - -MornStar

[CTS2024] 众生之门 小清新构造题。 观察大样例可以发现答案不大于 \(3\),感性猜测可以在路径长度不超过 \(3\) 的情况下遍历整棵树,事实也确实如此。 进一步考虑答案一般为 \(0\) 和 \(1\),只有 \(n\) 比较小或者图…

CF1909I Short Permutation Problem

CF1909I Short Permutation Problem并非独立切,大量参考题解。 对于排列计数问题,考虑三个方向:容斥、连续段DP、按顺序加数。 发现容斥和连续段DP没前途,考虑按顺序加数。从 \(1\) ~ \(n\) 加数显然是不行的,因为…

ROS1 go2 vlp16 局部避障--3 篇 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

25.10.28随笔NOIP模拟赛总结

考试 开考看题,秒了 T1,感觉 T2 是简单 dp,T3 有点神秘不知道,T4 一眼有一个 \(\mathcal O(n^2)\)。于是顺序开题。T1 很快写了,T2 看了一个小时还是不会有点难崩,当时是很快想到一个 dp,设 \(f_{i,j,0/1}\) 表…