raywu的博客

博客

QOJ #5946. Up and Down 题解

2025-01-10 11:40:56 By raywu

Problem Link

题意

$n$ 个数的序列,保证数两两不同。

定义一个序列是好的,当且仅当存在一个 $i$,使得 $a_1 < a_2 < \cdots < a_i$ 且 $a_i > a_{i + 1} > \cdots > a_n$。

你可以交换相邻两个元素,问至少交换多少次才能使这个序列变成好的。

题解

考虑按照从大到小的顺序加数:每个数只能加到当前序列的最左边或者最右边。

这个有什么性质呢?考虑一个数刚加进去的时候,所有比他大的数都在他右边或左边。而前面加的数的位置是不影响当前数的插入的。

如果一个数 $a_i$ 插在序列最左边,那么所有比他大的数都在他右边。那么如果初始序列中 $i$ 左边比 $a_i$ 大的数的个数为 $k$,则 $a_i$ 需要和他们交换 $k$ 次。

右边同理,我们可以得到放入一个数 $a_i$ 的代价:

$$ p_i = \min(\sum_{j = 1}^{i - 1} [a_j > a_i], \sum_{j = i + 1}^n [a_j > a_i]) $$

最终答案即为:

$$ ans = \sum_{i = 1}^n p_i $$

求 $p$ 的话 BIT 正着、倒着扫两遍即可,记得中间要 clear。

时间复杂度 $O(Tn\log n)$

代码

Link

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。