1.分治法
在归并排序的基础上统计逆序对的个数。
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>
#include<cmath>
#include<bitset>
#include<sstream>
using namespace std;
#define INF 0x7fffffff
#define maxn 10005
typedef long long ll;
vector<int> A;
ll merge_count(vector<int>& a)
{
int n=a.size();
if(n<=1) return 0;
vector<int> b(a.begin(),a.begin()+n/2);
vector<int> c(a.begin()+n/2,a.end());
ll cnt=0;
cnt+=merge_count(b);
cnt+=merge_count(c);
//此时b和c已经排好序
int ai=0,bi=0,ci=0;
while(ai<n){
if(bi<b.size()&&(ci==c.size()||b[bi]<=c[ci])){
a[ai++]=b[bi++];
}
else{
cnt+=n/2-bi;
a[ai++]=c[ci++];
}
}
return cnt;
}
void solve()
{
printf("%lld\n",merge_count(A));
}
int main()
{
int n;
while(cin>>n&&n){
for(int i=0;i<n;i++){
int x;
cin>>x;
A.push_back(x);
}
solve();
}
return 0;
}