标签:
第1行:N,N为序列的长度(n <= 50000) 第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)
输出逆序数
4 2 4 3 1
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; }
标签:
原文地址:http://www.cnblogs.com/chen9510/p/5466970.html