笛卡尔树 O(n) 建树方法

//小根堆
for(int i=1;i<=n;i++){
	int k=top;
	while(k&&a[stk[k]]>a[i])k--;
	if(k)rs[stk[k]]=i;
	if(k<top)ls[i]=stk[k+1];
	stk[++k]=i;top=k;
}

beware: > not >=

(小根)笛卡尔树性质:子树内的点处在 \((前面第一个小于,后面第一个小于)\) 的开区间内。

经典题目:
CF1748E Yet Another Array Counting Problem
[EZEC R11]Unmemorable
CF1580D Subsequence

题型:下意识不要想错了,笛卡尔树不是 BST,是堆。

posted @ 2021-11-01 21:34  pengyule  阅读(81)  评论(0编辑  收藏  举报