笛卡尔树

构建

void build()
{
    for (int i = 1, top = 0, pos = 0; i <= n; ++i)
    {
        top = pos;//pos为当前栈顶,top为操作前栈顶
        while (pos && p[s[pos]] > p[i]) pos--;//单调栈
        if (pos) r[s[pos]] = i;//找到一个比自己小的点,接到右儿子上
        if (pos < top) l[i] = s[pos + 1];//把中间比自己大的点作为左儿子
        s[++pos] = i;
    }
}
posted @ 2022-09-26 16:07  sandom  阅读(43)  评论(3)    收藏  举报