sort it 树状数组+逆序对

 

sum[i]是1-i所有1的和,而i-sum[a[i]]就是在a[i]后面的数,即在i之前出现,却比他大的数。1是加在a[i]上,即i实际应该放的位置。而c[i]是为sum做准备的

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<stdlib.h>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<string>
10 #include<set>
11 #include<cctype>
12 #include<sstream>
13 #define mem(a) memset(a,0,sizeof(a))
14 #define LL long long
15 using namespace std;
16 const int N=1e6+5;
17 int a[N],c[N],n;
18 int lowbit(int x)
19 {
20     return x&-x;
21 }
22 void add(int x,int a)
23 {
24     while(x<=n) c[x]+=a,x+=lowbit(x);
25 }
26 int sum(int x)
27 {
28     int ans=0;
29     while(x)
30     {
31         ans+=c[x];
32         x-=lowbit(x);
33     }
34     return ans;
35 }
36 int main()
37 {
38     while(~scanf("%d",&n))
39     {
40         mem(c);
41         int ans=0;
42         for(int i=1;i<=n;i++)
43         {
44            scanf("%d",&a[i]);
45            add(a[i],1);
46            ans+=i-sum(a[i]);
47         }
48         printf("%d\n",ans);
49     }
50     return 0;
51 }
View Code

 

posted @ 2019-01-22 18:51  XXrl  阅读(173)  评论(0编辑  收藏  举报