题目大意就是求一个序列中逆序对的数目
输入格式:
第一行,一个数n,表示序列中有n个数。
第二行n个数,表示给定的序列。
输出格式:
给定序列中逆序对的数目。
输入样例#1:
6 5 4 2 6 3 1
输出样例#1:
11
说明
对于50%的数据,n≤2500
对于100%的数据,n≤40000。
第一种方法是用归并排序求逆序对
1 //2017年8月21日17:26:42 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 7 const int maxn = 100001; 8 int a[maxn]; 9 int temp[maxn]; 10 int n; 11 int ans; 12 13 void merge_sort(int i, int j){ 14 if(i == j) 15 return; 16 int mid = (i+j)/2; 17 merge_sort(i, mid); 18 merge_sort(mid+1, j); 19 int l=i, r=mid+1, k=i; 20 for(; k<=j; k++){ 21 if(l > mid){ 22 temp[k] = a[r]; 23 r++; 24 }else if(r > j){ 25 temp[k] = a[l]; 26 l++; 27 }else if(a[l] <= a[r]){ 28 temp[k] = a[l]; 29 l++; 30 }else if(a[l] > a[r]){ 31 temp[k] = a[r]; 32 r++; 33 ans = ans+mid-l+1; 34 } 35 } 36 for(int k=i;k<=j;k++) 37 a[k] = temp[k]; 38 } 39 40 41 42 43 int main(){ 44 cin >> n; 45 for(int i=1;i<=n;i++) 46 cin >> a[i]; 47 merge_sort(1, n); 48 49 cout << ans; 50 51 return 0; 52 } 53 54 //暴力解法 55 /* 56 for(int i=1;i<=n;i++) 57 for(int j=1;j<=n;j++){ 58 if(i > j){ 59 if(a[i] < a[j]){ 60 ans++; 61 } 62 } 63 } 64 65 cout << ans; 66 */