HDU 2689 sort it - from lanshui_Yang

Problem Description
You want to processe a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. Then how many times it need.
For example, 1 2 3 5 4, we only need one operation : swap 5 and 4.
 


Input
The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 1000); the next line contains a permutation of the n integers from 1 to n.
 


Output
For each case, output the minimum times need to sort it in ascending order on a single line.
 


Sample Input
3 1 2 3 4 4 3 2 1
 


Sample Output
0 6
题目大意:给你一个数n ,然后有1 ~ n 的一个排列,让你找出这个排列的逆序数。
解题思路:此题可以用树状数组来解,树状数组的三个用途:1.单点更新,区间求和 2、区间更新,单点求和
3、求逆序数。求逆序数想法较简单,请看代码:
#include<iostream>

#include<cstring>

#include<string>

#include<cstdio>

#include<cmath>

#include<algorithm>

#include<queue>

using namespace std ;

const int MAXN = 1e5 + 7 ;

int C[MAXN] ;

int n ;

int lowbit(int x)

{

    return x & -x ;

}

int sum(int x)

{

    int sumt = 0 ;

    while (x > 0)

    {

        sumt += C[x] ;

        x -= lowbit(x) ;

    }

    return sumt ;

}

void add(int x , int d)

{

    while (x <= n)

    {

        C[x] += d ;

        x += lowbit(x) ;

    }

}

int main()

{

    while (scanf("%d" , &n) != EOF)

    {

        int i ;

        int ans = 0 ;

        memset(C , 0 ,sizeof(C)) ;

        for(i = 1 ; i <= n ; i ++)

        {

            int a ;

            scanf("%d" , &a) ;

            add(a , 1) ;  // 此处是整个程序的精华部分,请好好理解

            ans += i - sum(a) ;  // 统计逆序数

        }

        printf("%d\n" , ans) ;

    }

    return 0 ;

}



你可能感兴趣的:(sort)