在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。
現在,給你一個N個元素的序列,請你判斷出它的逆序數是多少。
比如 1 3 2 的逆序數就是1。
2 2 1 1 3 1 3 2
0 1
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=1000001; int a[maxn],b[maxn]; long long sum; /** 歸並 */ void Merge(int begin,int mid,int end){ int i=begin,j=mid+1,pos=begin; //對一個個序列排序的過程 while(i<=mid && j<=end){ if(a[i]<=a[j]){ b[pos++]=a[i++]; }else{ b[pos++]=a[j++]; sum+=mid-i+1;//求逆序數 } } while(i<=mid) b[pos++]=a[i++]; while(j<=end) b[pos++]=a[j++]; for(int i=begin,j=begin;i<=end;i++,j++) a[i]=b[j]; } /** 排序 */ void Sort(int begin,int end){ if(begin<end){ int="" mid="(begin+end)/2;" sum="0;" i="1;i<=n;i++)" return="" pre=""> </end){></algorithm></cstring></cstdio>