题解:困牛排序
算法思路
注意到最优解的形式一定为:找到原数列最长的单调上升连续后缀(即后缀中恰好是连续的若干个整数,且按升序排列)。那么需要进行操作的数就是这个后缀之前的所有数。
把这个后缀存入一个 vectorvectorvector ,然后把前面的数按照顺序插入这个 vectorvectorvector ,同时维护单调性。但是 vectorvectorvector 的插入操作是单次 O(n)O(n)O(n) 的,所以考虑用树状数组,每次查询 vectorvectorvector 中比当前位置小的数量,可以优化单次到 O(logn)O(\log n)O(logn) 。
注意每次查询时除了在树状数组中的查询结果之外,还要加上前缀中的剩余元素,因为操作剩余前缀时当前元素会对应前移。
代码实现