hdu5122K.Bro Sorting 树状数组

//给出一个序列, 
//每一轮可以将一个数与其后面相邻的小于它的
//数交换直到其后面的数大于它
//问需要交换几次
//直接用树状数组找后面有小于它的数的数的个数 
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 3e6+10 ;
int tree[maxn] ;
void update(int x , int dx)
{
    while(x < maxn)
    {
        tree[x] += dx ;
        x += x&(-x) ;
    }
}
int getsum(int x)
{
    int sum = 0 ;
    while(x)
    {
        sum += tree[x] ;
        x -= x&(-x) ;
    }
    return sum ;
}
int main()
{
    int t ;
    scanf("%d" , &t) ;
    int cas = 0 ;
    while(t--)
    {
        int n ;
        memset(tree , 0 , sizeof(tree)) ;
        scanf("%d" , &n) ;
        int ans = 0 ;
        int a ;
        for(int i = 1;i <= n;i++)
        {
            scanf("%d" , &a) ;
            update(a , 1) ;
            int tmp = getsum(a) ;
            if(tmp != a)
            ans++ ;
        }
        printf("Case #%d: " , ++cas) ;
        cout<<ans<<endl;
    }
    return 0 ;
}




你可能感兴趣的:(hdu5122K.Bro Sorting 树状数组)