求排列的逆序数之树状数组

代码实现

#include<iostream>

#include<cstdio>

#include<cstdlib>

using namespace std;

int num[100001];

int n,a[100001];

long long count=0; 

void add(int x){

for(int i=x;i<=n;i+=(i&-i))num[i]++;

}

void query(int p){

for(int i=p; i; i -= (i & -i))count+=num[i];

}

int main(){

cin>>n;

for(int i=1;i<=n;i++)

cin>>a[i];

for(int i=n;i>=1;i--){

query(a[i]);

add(a[i]);

}

cout<<count;

}

反着做,也可正着做(求此数到n的区间和

posted @ 2017-06-10 14:39  tsharry  阅读(115)  评论(0编辑  收藏  举报