《树状数组求逆序对数》

来源:互联网 发布:淘宝美工外包 编辑:程序博客网 时间:2024/05/16 16:21
#include<stdio.h>#include<string.h>#define maxn 1005int tree[maxn];int lowbit(int x){    return x&(-x);}void update(int pos,int num){    while(pos<=maxn)    {        tree[pos]+=num;        pos+=lowbit(pos);    }}int sum(int pos){    int ans=0;    while(pos>0)    {        ans+=tree[pos];        pos-=lowbit(pos);    }    return ans;}int main(){    int t,i,num,ans;    while(~scanf("%d",&t))    {        memset(tree,0,sizeof(tree));        ans=0;        for(i=1;i<=t;i++)        {            scanf("%d",&num);            update(num,1);            ans+=i-sum(num);        }        printf("%d\n",ans);    }    return 0;

}

http://acm.hdu.edu.cn/showproblem.php?pid=2689

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
31 2 34 4 3 2 1
 

Sample Output
06
 

Author
WhereIsHeroFrom

0 0
原创粉丝点击