1019 逆序数

来源:互联网 发布:做长微博的软件 编辑:程序博客网 时间:2024/06/11 21:10
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示例
42431
Output示例
4
这个题可以用归并排序,求逆序数
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int ans=0;int sort(int *a,int *temp,int first,int mid,int last){int i,j,k;i=first,j=mid+1;k=first;while(i<=mid&&j<=last){if(a[i]<=a[j])temp[k++]=a[i++];else{temp[k++]=a[j++];ans+=mid+1-i;}}while(i<=mid){temp[k++]=a[i++];}while(j<=last)temp[k++]=a[j++];for(i=first;i<=last;i++)a[i]=temp[i];}void merge(int *a,int *temp,int first,int last){if(first<last){int mid;mid=(first+last)/2;merge(a,temp,first,mid);merge(a,temp,mid+1,last);sort(a,temp,first,mid,last);}}int main(){int a[50010],b[50010]; int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}merge(a,b,1,n);cout<<ans<<endl;return 0;}


原创粉丝点击