本题是一道并查集经典题 因为输入的数字在0~n-1之间所以所求最小逆序数可用并查集求出(归并也可以我只给出并查集的代码
并查集就是把一个数据直接往父节点上链接 最终是有多少相关就有多少棵树
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=5005;
const int inf=99999999;
int c[N];
int a[N];
int lowbit(int x){
return x&(-x);
}
void update(int x){
while(x<N){
c[x]++;
x+=lowbit(x);//寻找到根节点
}
}
int get_sum(int x){
int ans=0;
while(x>0){
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
int n, i, j, k;
while(scanf("%d",&n)==1){
memset(c,0,sizeof(c));
int num=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i]++;
num+=get_sum(N-1)-get_sum(a[i]);
update(a[i]);
}
int minh=inf;
for(i=1;i<=n;i++)
{
num=num-(a[i]-1)+(n-a[i]);
minh=min(minh,num);
}
printf("%d\n",minh);
}
}
)