笛卡尔树
笛卡尔树
定义
以一个数列为基础,存储数列中元素,满足两个限制的树。一是数列中元素的下标满足二叉搜索树的性质,二是元素的大小满足堆的性质。
建树
使用单调栈,在线建树。考虑从左往右在已有的笛卡尔树中添加元素,因为新元素的下标最大,所以只可能取代最右链中的某个元素,并将其收为左儿子。又由于堆的性质,所以右链元素单调,且弹出就不再加入,使用单调栈维护右链。每个元素加入一次删除一次,时空复杂度均为
stk.emplace(0);
p[0]=0;//虚拟节点
for(int i=1;i<=n;++i){
while(!stk.empty()&&p[i]<p[stk.top()])stk.pop();
int pos=stk.top();
lc(i)=rc(pos);
t[lc(i)].fa=i;
rc(pos)=i;
t[i].fa=pos;
stk.emplace(i);
}
应用
RMQ问题,各种依赖于min,max的分治,然后转化到树上问题,method of four russians 算法
本文作者:⅔钱强
本文链接:https://www.cnblogs.com/life-of-a-libertine/p/18028442
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步