[树状数组]求逆序对

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\n",ans);
49     }
50     return 0;
51 }
View Code

挖个坑下回把归并和快排的求逆序对放下来。

猜你喜欢

转载自www.cnblogs.com/Kaike/p/10318724.html