现在的位置: 首页 > 综合 > 正文

HDU 2689 sort it – from lanshui_Yang

2019年01月07日 ⁄ 综合 ⁄ 共 1120字 ⁄ 字号 评论关闭
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 ;
}

抱歉!评论已关闭.