在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
如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<algorithm> #include<cstdio> #include<cstring> #include<map> #define N 52005 using namespace std; int a[N],c[N],d[N]; int Lowbit(int t) { ///设k为t末尾0的个数,则求得为2^k=t&(t^(t-1)); return t&(t^(t-1)); } void update(int x) { while(x > 0) { c[x]+=1; x -= Lowbit(x); } } int sum(int li) { int sum=0; while(li<=N) { sum+=c[li]; li=li+Lowbit(li); } return sum; } map<int ,int>q; int main() { int n,x; int Sum; while(scanf("%d",&n)!=EOF) { Sum=0; memset(c,0,sizeof(c)); for(int i=0;i<n;i++) { scanf("%d",&a[i]); d[i]=a[i]; } sort(a,a+n); int pre=1,tot=1; for(int i=0;i<n;i++) { if(a[i]==pre) { a[i]=tot; q[pre]=tot; } else { pre=a[i]; a[i]=++tot; q[pre]=tot; } } for(int i=0;i<n;i++) { d[i]=q[d[i]]; } // for(int i=0;i<n;i++) // cout<<d[i]<<" "; for(int i=0;i<n;i++) { Sum+=sum(d[i]+1); update(d[i]); } printf("%d\n",Sum); } return 0; }
时间: 2024-10-16 17:58:58