笛卡尔树
定义和建树这里都讲得很清楚:https://oi-wiki.org/ds/cartesian-tree/
OIWIKI大法吼哇
说白了就是拿一个栈维护以根向右的链
然后维护一下大小就好了
参考code:
for(int i = 1; i <= n; i ++) {
while(top) {
if(a[sta[top]] < a[i]) {
ch[sta[top]][1] = i;
break;
} else {
ch[sta[top]][1] = ch[i][0];//有意思的操作,类似rotate
ch[i][0] = sta[top];
top --;
}
}
没了