问题描述
你需要分析排序算法,将 n 个互不相同的整数,通过交换两个相邻的元素使得数列有序的 最少交换次数。
比如,原数列为:
9,1,0,5,4
排序后的数列为:
0,1,4,5,9
输入格式
第一行一个整数 n(n≤500000)。
接下来 n 行,每行一个整数 ai(ai≤10^9)。
输出格式
输出一个整数,表示操作次数。
样例输入
5
9
1
0
5
4
样例输出
6
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
using namespace std;
const int MAX_N=500050;
int num[MAX_N];
int temp[MAX_N];
int C[MAX_N];
int ans[MAX_N];
int n,m;
map<int,int> mp;
int lowbit(int p){
return p&(-p);
}
void change(int p){
for(;p<=n;p+=lowbit(p)){
C[p]++;
}
return;
}
int getsum(int p){
int res=0;
for(;p;p-=lowbit(p)){
res+=C[p];
}
return res;
}
int main(){
cin>>n;
memset(C,0,sizeof(C));
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
temp[i]=num[i];
}
sort(temp,temp+n);
m=unique(temp,temp+n)-temp;
for(int i=0;i<m;i++){
mp[temp[i]]=i+1;
}
long long int myans=0;
for(int i=0;i<n;i++){
ans[i]=mp[num[i]];
change(ans[i]);
myans+=i+1-getsum(ans[i]);
}
cout<<myans;
return 0;
}