HDU 1394 Minimum Inversion Number

来源:互联网 发布:电商公司数据分析 编辑:程序博客网 时间:2024/06/06 02:38

本题是一道并查集经典题  因为输入的数字在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);    }}

0 0
原创粉丝点击