在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
如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
这个题可以用归并排序,求逆序数
#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; }