歸並排序(逆序對數)
阿新 • • 發佈:2018-07-21
poj 中間 分享圖片 clas 求逆序對 display closed 歸並排序 對數
ll qans; // 記錄答案 int date[maxn]; // 數據數組 int tarray[maxn]; // 歸並排序的中間數組 // POJ - 2299 SGU - 180 void merge(int arr[], int left, int right, int tarr[]) { if (left>=right) return ; int m = (left+right) >> 1; merge(arr, left, m, tarr); merge(arr, m+1, right, tarr);View Codeint i,j, cnt; i = left; j = m+1; cnt = 0; while (i<=m && j<=right) { if (arr[i] <= arr[j]) tarr[cnt++] = arr[i++]; else { qans += (ll)m - i + 1; // 求逆序對. tarr[cnt++] = arr[j++]; } } while (i<=m) tarr[cnt++] = arr[i++];while (j<=right) tarr[cnt++] = arr[j++]; for (i=0; i<cnt; ++i) arr[left++] = tarr[i]; }
歸並排序(逆序對數)