笛卡尔树

笛卡尔树

其实也没什么好说的,这里就稍微总结一下

笛卡尔树中每个节点存在优先值和键值,其中按照键值构成二叉搜索树,而优先值满足父亲的优先值大于儿子节点

构造方法可以通过\(\tt ST\)表或线段树等\(O(n\log n)\)实现,也可以使用单调栈\(O(n/n\log n)\)实现

按照键值从小到大将节点插入笛卡尔树中,过程中维护最右的一条链,使用单调栈进行维护

不断弹出优先值小于当前节点的节点,将最后弹出的一个设为其左儿子,将自己作为栈顶元素的右儿子

可以证明,这样得到的满足笛卡尔树的性质

笛卡尔树存在一些性质:

  • 对于键值/优先值互不相同的序列,其形成的笛卡尔树唯一
  • 对于序列\(a\),以键值\(i\)优先值\(a_i\)建出的笛卡尔树,区间\([l,r]\)的最大值为\(a_{\tt lca(l,r)}\)

所以这样我们就可以得到\(O(q+n\alpha(n))\)的离线区间最小值算法,以及\(O((n+q)\log\log n)\)的在线区间最小值算法

	for(int i=1;i<=s;++i){
		int la=0;
		while(sta.size()&&a[sta.top()]>a[i])la=sta.top(),sta.pop();
		ch[i][0]=la;
		if(sta.size())ch[sta.top()][1]=i;sta.push(i);
	}while(sta.size()>1)sta.pop();
    ```
posted @ 2021-09-02 16:44  ファイナル  阅读(103)  评论(0)    收藏  举报