使用树状数组记录逆序对数。
把数组按照大小顺序插入,getsum(i)就是i前面的比他大的数。
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 5 using namespace std; 6 7 const int maxn = 500005; 8 int reflect[maxn],c[maxn],N; 9 10 struct Node 11 { 12 int val; 13 int pos; 14 bool operator < (const Node &r) const 15 { 16 return val < r.val; 17 } 18 }node[maxn]; 19 20 int lowbit(int x) 21 { 22 return x&(-x); 23 } 24 25 void update(int x) 26 { 27 while(x<=N) 28 { 29 c[x] += 1; 30 x += lowbit(x); 31 } 32 } 33 34 int getsum(int x) 35 { 36 int sum = 0; 37 while(x > 0) 38 { 39 sum += c[x]; 40 x -= lowbit(x); 41 } 42 return sum; 43 } 44 45 int main() 46 { 47 while(~scanf("%d",&N) && N) 48 { 49 for(int i=1;i<=N;i++) 50 { 51 scanf("%d",&node[i].val); 52 node[i].pos = i; 53 } 54 sort(node+1,node + N+1); 55 for(int i=1;i<=N;i++) reflect[node[i].pos] = i; 56 memset(c,0,sizeof c); 57 58 long long ans = 0; 59 for(int i=1;i<=N;i++) 60 { 61 update(reflect[i]); 62 ans += i - getsum(reflect[i]); 63 } 64 printf("%lld ",ans); 65 } 66 }