今天刚刚出去跑步了才想起来博客没写,序列 S={s1,s2,…,sn}S={s1,s2,…,sn} 被称为 heapable ,当且仅当存在一个二叉树 T , n 个点均作为 T 的一个节点,且满足任意非根节点 sisi 和其父节点 sjsj , sj≤sisj≤si 且 j<ij<i 。
现在有一个序列 a1,a2,…,ana1,a2,…,an ,相应将其分成若干个 heapable 的子序列,问使得子序列个数最少的策略。
解题思路
已知每个树上的节点 sjsj 均可有最多两个子节点 sisi ,要求 sj≤sisj≤si 。将所有仍可连接子节点的节点用一个 set 来维护,保证其根据点对应的 aiai 从小到大排序。对于一个新的 aiai 来说,采用贪心策略将其作为最大的不大于 aiai 值的节点的子节点,用 set.upper_bound() 可以在 O(set.size())O(set.size()) 复杂度内实现查找。
需要注意的是,每个节点最多只能有两个子节点,故当某节点已经连接了两个子节点后,应将其从 set 中删除。
加油!!!