题意
$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)$