树状数组的应用 逆序对

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int a[1000000],b[1000000],dis[1000000];
 5 int lowbit(int x)
 6 {
 7     return x&(-x);
 8 }
 9 
10 void update(int x,int v )
11 {
12     while(x<=n)
13     {
14         a[x]+=v;
15         x+=lowbit(x);
16     }
17 }
18 int query(int x)  //问的是前面有几个比它小的   i-query(x)就是前面有几个比它大的
19 {
20     int sum=0;
21     while(x)
22     {
23         sum+=a[x];
24         x-=lowbit(x);
25     }
26     return sum;
27 }
28 int main()
29 {
30 
31     cin>>n;
32     for(int i=1;i<=n;i++)   //下面是离散化的框架模板    离散化用于比较数字大小,并不在意数字本身是多少,这样做就可以节省空间
33     {
34         cin>>b[i];
35         dis[i]=b[i];
36     }
37     std::sort(b+1,b+1+n);
38     int len=std::unique(b+1,b+1+n)-b-1;
39     for(int i=1;i<=n;i++)
40     {
41         dis[i]=std::lower_bound(b+1,b+len+1,dis[i])-b;
42     }
43     int ans=0;  //局部变量再不赋初值的情况下不会初始化为0
44     for(int i=1;i<=n;i++)
45     {
46         update(dis[i],1);
47         ans+=i-query(dis[i]);
48 }
49 cout<<ans;
50 }

 

posted @ 2022-02-09 20:52  九点的日落  阅读(25)  评论(0)    收藏  举报