樹狀數組求逆序數的模板

來源:互聯網
上載者:User
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define lowbit(x) x&(-x)int res[1000005] , tree[1000005] ;struct num{    int val,pos;}m[1000005];bool cmp (num a, num b){    return a.val<b.val;}void plus ( int x ,int n ){        //樹狀數組儲存法    while( x <= n ){        tree[x] ++;        x += lowbit(x);    }}int SUM ( int x ){               //樹狀數組的部分了    int s = 0;    while(x){        s += tree[x];        x -= lowbit(x) ;    }    return s;}int main(){    int n , x , a , b ;    while( ~scanf( "%d" , &n ) )    {        memset( m , 0 , sizeof(m) );        memset( res , 0 , sizeof(res) );        memset( tree , 0 , sizeof(tree) );        for( int i = 1 ; i <= n ; i++ ){            scanf( "%d" , &x );            m[i].val = x ;            m[i].pos = i ;        }        sort( m+1 , m+n+1 , cmp );        for( int i = 1 ; i <= n ; i++ ){     //離散化            res[m[i].pos] = i ;        }        __int64 sum = 0;        for( int i = 1 ; i <= n ; i++ ){            plus( res[i] , n );            sum += ( i - SUM( res[i]-1 ) - 1) ;        }        printf("%I64d\n",sum);    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.