当前位置:编程学习 > C/C++ >>

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

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,