首页 > 代码库 > 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 逆序数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。