首页 > 代码库 > 1019 逆序数

1019 逆序数

1019 逆序数

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
Input
第1行:N,N为序列的长度(n <= 50000)
第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)
Output
输出逆序数
Input示例
4
2
4
3
1
Output示例
4

一个简单的求逆序数,树状数组最好不过。
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #define N 50005
 6 #define mem(a) memset(a,0,sizeof(a))
 7 using namespace std;
 8 
 9 struct Node{
10     int a,b;
11 }node[N];
12 int tree[N];
13 bool cmp(Node x,Node y){
14     return x.a>y.a;
15 }
16 int lowbit(int x){ return x&(-x);}
17 
18 int update(int x){
19     while(x<N){
20         tree[x]++;
21         x+=lowbit(x);
22     }
23 }
24 int sum(int x){
25     int sum=0;
26     while(x){
27         sum+=tree[x];
28         x-=lowbit(x);
29     }
30     return sum;
31 }
32 int main() {
33     int n;
34     cin>>n;
35     mem(tree);
36     mem(node);
37     for(int i=1;i<=n;i++){
38         cin>>node[i].a;
39         node[i].b=i;
40     }
41     sort(node+1,node+1+n,cmp);
42     int cnt=0;
43     for(int i=1;i<=n;i++){
44         cnt+=sum(node[i].b);
45         update(node[i].b);
46     }
47     cout<<cnt<<endl;
48     return 0;
49 }

 

1019 逆序数