《算法笔记》13.2小节——专题扩展->树状数组(BIT) 问题 A: 最少的交换

题目描述

现在给你一个由n个互不相同的整数组成的序列,现在要求你任意交换相邻的两个数字,使序列成为升序序列,请问最少的交换次数是多少?

输入

输入包含多组测试数据。每组输入第一行是一个正整数n(n<500000),表示序列的长度,当n=0时。
接下来的n行,每行一个整数a[i](0<=a[i]<=999999999),表示序列中第i个元素。

输出

对于每组输入,输出使得所给序列升序的最少交换次数。

样例输入
5
9
1
0
5
4
3
1
2
3
0
样例输出
6
0

分析: 这道题也可以看做求逆序数,使用归并排序对原数组进行排序,并记录交换的次数即可。代码如下:

#include
#include 
#include  
#include  
#include   
#include   
#include   
#include    
#include    
#include    
#include    
#include      
#include      
#define INF 0x3fffffff
#define db1(x) cout<<#x<<"="<<(x)<

当然这道题放在树状数组这一节,也可以用树状数组解决。虽然数据的范围很大,但总共只有500000 个数据,要先对数据进行离散化,再用树状数组求出每一个数的前面有多少个比它大的数,就能得到这个数的逆序数。最后求总和即可。不过使用树状数组时,需要先把原数组进行排序,所以不如归并的方法。

#include
#include 
#include  
#include  
#include   
#include   
#include   
#include    
#include    
#include    
#include    
#include      
#include      
#define INF 0x3fffffff
#define db1(x) cout<<#x<<"="<<(x)<

你可能感兴趣的:(《算法笔记》,算法)