您的位置:首页 > 其它

HDU 1394 Minimum Inversion Number

2015-08-13 19:39 435 查看
本题是一道并查集经典题 因为输入的数字在0~n-1之间所以所求最小逆序数可用并查集求出(归并也可以我只给出并查集的代码

并查集就是把一个数据直接往父节点上链接 最终是有多少相关就有多少棵树

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=5005;
const int inf=99999999;

int c
;
int a
;

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);
    }
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: