首先我们需要按 k 将键值对排序,假设我们将索引当作 k 则序列就是已排序的。从左往右遍历即可 O(n) 完成笛卡尔树的建立,使用单调栈维护一个前缀升序关系。假设现将 x 插入单调栈,压在其下方的是 y(即前缀最近小于),最近出栈的元素是 z,只需将 x 作为 y 的右儿子,将 z 作为 x 的左儿子即可插入两者之间即可。
// Jamhus Tao / GreatLiangpi // Start at 2022/10/6 // Please using int32_t and int64_t to replace the int and long long. #include<bits/stdc++.h> #define int int64_t #define endl '\n' #pragma GCC optimize(3, "Ofast", "inline") usingnamespace std;