笛卡尔树 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,是堆。