[树状数组]求逆序对
Posted kaike
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[树状数组]求逆序对相关的知识,希望对你有一定的参考价值。
ci 的意思是在前lowbit 中元素的个数。
然后往前i个中的sum就是小于等于这个i的个数
这个数的位置-小于等于这个i的个数 就是前面大于这个数的个数
小于等于这个数的个数肯定比 这个数的位置要小。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<string> 5 #include<cstring> 6 #include<queue> 7 #include<map> 8 #include<set> 9 #include<algorithm> 10 using namespace std; 11 typedef long long ll; 12 const int N=1000+10; 13 int c[N],n,aa; 14 int lowbit(int x) 15 { 16 return x&-x; 17 } 18 void insert(int i,int x) 19 { 20 while(i<=n) 21 { 22 c[i]+=x; 23 i+=lowbit(i); 24 } 25 } 26 int getsum(int i) 27 { 28 int sum=0; 29 while(i>0) 30 { 31 sum+=c[i]; 32 i-=lowbit(i); 33 } 34 return sum; 35 } 36 int main() 37 { 38 while(scanf("%d",&n)!=EOF) 39 { 40 int ans=0; 41 memset(c,0,sizeof(c)); 42 for(int i=1;i<=n;i++) 43 { 44 scanf("%d",&aa); 45 insert(aa,1); 46 ans+=i-getsum(aa); 47 } 48 printf("%d ",ans); 49 } 50 return 0; 51 }
挖个坑下回把归并和快排的求逆序对放下来。
以上是关于[树状数组]求逆序对的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1394 Minimum Inversion Number (树状数组求逆序对)