首页 > 代码库 > HDU 2689Sort it 树状数组 逆序对

HDU 2689Sort it 树状数组 逆序对

Sort it

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4110    Accepted Submission(s): 2920


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
 

 

Author
WhereIsHeroFrom
 

 

Source
ZJFC 2009-3 Programming Contest
 

 

Recommend
yifenfei   |   We have carefully selected several similar problems for you:  1892 2688 3584 2492 2227 
 
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2689
题意:交换相邻的两个数,使得序列是上升的。问需要交换多少次。
思路:求出每个数ai前面有多少个数比ai大,或者每个数ai后面有多少个数比ai小。第一种方法只需要交换树状数组更新和求和的函数。第二种方法就是求逆向对的数量和只需要逆向输入a,直接标准的树状数组。
代码:
技术分享
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int MAXN=1100;int c[MAXN];inline int Lowbit(int x){    return x&(-x);}void update(int i,int val){    for(i; i>0; i-=Lowbit(i))        c[i]+=val;}int sum(int i){    int temp=0;    for(i; i<=MAXN; i+=Lowbit(i))        temp+=c[i];    return temp;}int main(){    int i,n;    int a;    while(~scanf("%d",&n))    {        int ans=0;        memset(c,0,sizeof(c));        for(i=1; i<=n; i++)        {            scanf("%d",&a);            ans+=sum(a);            update(a,1);        }        cout<<ans<<endl;    }    return 0;}
求左边大于等于 a[i]的数的个 数

HDU 2689Sort it 树状数组 逆序对