#include <stdio.h> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn=500001; int c[maxn],n,m; struct NUM { int id,num; } a[maxn]; int cmp1(NUM a,NUM b) { return a.num<b.num; } int cmp2(NUM a,NUM b) { return a.id<b.id; } inline int lowbit(int x) { return x&(-x); } void update(int p,int d) { while(p<=m) c[p]+=d,p+=lowbit(p); } int sum(int x) { int ans=0; while(x) ans+=c[x],x-=lowbit(x); return ans; } int main() { while(scanf("%d",&n)==1&&n) { memset(c,0,sizeof(c)); long long ans=0; int t; m=2; for(int i=1; i<=n; i++) { scanf("%d",&t); t++; a[i].id=i,a[i].num=t; } sort(a+1,a+n+1,cmp1); a[1].num=1; for(int i=2; i<=n; i++) if(a[i].num!=a[i-1].num) a[i].num=m++; sort(a+1,a+n+1,cmp2); for(int i=1; i<=n; i++) { update(a[i].num,1); ans+=i-sum(a[i].num); } printf("%lld\n",ans); } return 0; }
Ultra-QuickSort
最新推荐文章于 2017-08-15 19:58:11 发布