求逆序对即可,然而发现还是bit容易写。。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Ultra-QuickSort
Time Limit: 7000MS   Memory Limit: 65536K
Total Submissions: 49549   Accepted: 18142

Description

In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence 
9 1 0 5 4 ,

Ultra-QuickSort produces the output 
0 1 4 5 9 .

Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.

Input

The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.

Output

For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.

Sample Input

5
9
1
0
5
4
3
1
2
3
0

Sample Output

6
0

Source

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 #define ll long long
 6 #define rep(i,n) for(int i=1;i<=n;i++)
 7 struct data{
 8     ll w;int c;
 9     bool operator<(const data&rhs)const {
10       return w<rhs.w;}
11 }e[500005];
12 int t[500005],n;
13 int lowbit(int x){return x&-x;}
14 void insert(int x){
15     for(int i=x;i<=n;i+=lowbit(i))
16       t[i]++;
17 }
18 int find(int x){
19     int tmp=0;
20     for(int i=x;i;i-=lowbit(i))
21         tmp+=t[i];
22     return tmp;
23 }
24 int main(){
25     while(scanf("%d",&n)&&n){
26         memset(t,0,sizeof(t));
27         rep(i,n){
28             scanf("%lld",&e[i].w);
29             e[i].c=i;
30         }
31         sort(e+1,e+n+1);
32         ll ans=0;
33         rep(i,n){
34             insert(e[i].c);
35             ans+=i-find(e[i].c);
36         }
37         printf("%lld\n",ans);
38     }
39     return 0;
40 }
View Code