QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: jiangly

Posted at: 2025-12-14 06:54:46

Last updated: 2025-12-14 06:54:49

Back to Problem

题解

不妨设 $a$ 是一个排列。

被删除的位置把 $a$ 划分成了若干段,我们只需要求这些段当中逆序对数量的最大值。

我们用 set 或 map 维护这些段,然后每一段用值域线段树维护段中的数。令 $f_x$ 是 $x$ 所在段中在 $x$ 之前且比 $x$ 大的数的个数,那么一段的逆序对就等于 $\sum_{x\in S} f_x$。

现在我们要把一段分裂成两段,也就要分裂线段树。为了分裂,我们还应该在线段树上维护子树中的数的下标的最大值和最小值。假设我们把左子树分成了 $(a,b)$,右子树分成了 $(c,d)$,那么左边的段的两个子树分别为 $a,c$,右边的段的两个子树分别为 $b,d$。我们还要维护 $f_x$,注意分裂只会导致 $b$ 中的数的 $f_x$ 减去 $c$ 中的数的个数(我们在递归分裂的过程中已经处理了 $a,b$ 之间和 $c,d$ 之间的影响),打一个加法标记即可。

再用一个 multiset 维护每个段的逆序对数。

时间复杂度分析和线段树合并一致,只需要考虑结点数,总时间复杂度 $O(n\log n)$。

Comments

No comments yet.