POJ-2299-Ultra-QuickSort-归并排序求逆序数

Posted petewell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-2299-Ultra-QuickSort-归并排序求逆序数相关的知识,希望对你有一定的参考价值。

原文引用https://www.dazhuanlan.com/2019/08/26/5d62f77c1b321/


Description

技术图片

题目大意,给你一串每个元素不相同的序列,每次只能相邻的两个元素进行交换,求,最小多少次交换可以使该序列成为上升序列。

注意:明白一个规律,一个数x,肯定要和在它左边且比它大的数进行交换,即求逆序数。

struct node
    int elem;
    int old;
;
node arr[500010];
int a[500010];
int c[500010];
int n;
int cmp(node a, node b)

    return a.elem <= b.elem;

int main()

    int i;
    while(scanf("%d", &n) && n)
    
        memset(c, 0, sizeof(c));
        arr[0].elem = -1;
        arr[0].old = 0;
        for(i = 1; i <= n; i )
        
            scanf("%d", &arr[i].elem);
            arr[i].old = i;
        
        sort(arr, arr n 1, cmp);//排序
        for(i = 1; i <= n; i )//将新排好序的下标一一对应存下来;
        
            a[arr[i].old] = i;
        
        double sum_ = 0;
        for(i = 1; i <= n; i )
        
            add(a[i], 1);//将这个数插入
            sum_ = i - sum(a[i]);//得到比当前这个数大,并且初始时在它的左边的数的个数;即得到它的最优移动次数。
        
        printf("%.0lfn", sum_);
    
    return 0;

int lowbit(int x)

    return x&(-x);

double sum(int end_)

    double sum = 0;
    while(end_ > 0)
    
        sum = c[end_];
        end_ -= lowbit(end_);
    
    return sum;

void add(int i, int elem)

    while(i <= n)
    
        c[i] = elem;
        i = lowbit(i);
    
    return ;

以上是关于POJ-2299-Ultra-QuickSort-归并排序求逆序数的主要内容,如果未能解决你的问题,请参考以下文章

poj2299 Ultra-QuickSort

poj 2299 Ultra-QuickSort

POJ - 2299 Ultra-QuickSort

POJ 2299 -Ultra-QuickSort-树状数组求逆序数

poj 2299 Ultra-QuickSort

POJ 2299 Ultra-QuickSort