CF竞赛题目讲解_CF1269E(树状数组+树状数组+二分查找)
2022-08-09 12:56 作者:Clayton_Zhou | 我要投稿
// https://codeforces.com/contest/1269/problem/E
题意:
每次可以交换相邻的数据,求最小能够出现1,2,..., k子序列的交换次数
思路:
先考虑逆序数, 3 2 1,交换成 1 2 3的最小次数,就是求 3 2 1这个序列的逆序数=3
这题稍微有点变化,就是3 2 1 中间可能还存在 其它数字,比如 3 4 5 2 1,要我们求 出现 3 2 1 的最小交换次数;
可以想到,先把 4 和 5 剔除,将 3 2 1移动在一起,再求逆序数;所以最后的答案 = 剔除4、5的次数 + 321逆序数的值。
求逆序数,套树状数组的模板即可。
所以重点是求剔除4和5多余元素的最少交换次数,这里要用到二分查找,求 最合适的中间位置,使得左右平衡,从而交换次数最少。 二分查找使用第一个树状数组。
剔除4和5多余元素的最少交换次数,使用另外一个树状数组。