笛卡尔树
定义
以一个数列为基础,存储数列中元素,满足两个限制的树。一是数列中元素的下标满足二叉搜索树的性质,二是元素的大小满足堆的性质。
建树
使用单调栈,在线建树。考虑从左往右在已有的笛卡尔树中添加元素,因为新元素的下标最大,所以只可能取代最右链中的某个元素,并将其收为左儿子。又由于堆的性质,所以右链元素单调,且弹出就不再加入,使用单调栈维护右链。每个元素加入一次删除一次,时空复杂度均为 \(O(n)\)
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 算法
标签:下标,数列,笛卡尔,元素,单调,右链 From: https://www.cnblogs.com/life-of-a-libertine/p/18028442