?????????http://acm.hdu.edu.cn/showproblem.php?pid=2443
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????
???n???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????
?????????
??????????????????????????????????????????????????????????????????????????????
???????????????
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 void combine_sortd_list(int* to, int* sub1, int sz1, int* sub2, int sz2); 5 void merge_sort(int* lst, int sz); 6 const int MAX = 1e5 + 5; 7 int arr[MAX]; 8 long long int ans; 9 int main() 10 { 11 int Group, N, A; 12 cin >> Group; 13 while (Group--) 14 { 15 memset(arr, 0, sizeof arr); 16 cin >> N >> A; 17 for (int j, i = N-1; i >=0; --i) 18 { 19 cin >> j; 20 arr[i] = j - A + arr[i + 1]; 21 } 22 ans = 0; 23 merge_sort(arr, N + 1); //?????????????????? 24 cout << ans << endl; 25 } 26 } 27 void merge_sort(int* lst, int sz) 28 { 29 static int tmp[MAX]; 30 if (sz <= 1)return; 31 int* l = lst; 32 int lsz = (sz + 1) / 2; 33 int* r = l + lsz; 34 int rsz = sz / 2; 35 merge_sort(l, lsz); 36 merge_sort(r, rsz); 37 combine_sortd_list(tmp, l, lsz, r, rsz); 38 for (int i = 0; i < sz; ++i)lst[i] = tmp[i]; 39 } 40 void combine_sortd_list(int*to, int* sub1, int sz1, int* sub2, int sz2) 41 { 42 int i = 0, j = 0, k = 0; 43 while (i < sz1&&j < sz2) 44 if (sub1[i] <= sub2[j])to[k++] = sub1[i++]; 45 else 46 { 47 ans += sz1 - i; 48 to[k++] = sub2[j++]; 49 } 50 while (i < sz1)to[k++] = sub1[i++]; 51 while (j < sz2)to[k++] = sub2[j++]; 52 }
????????????????????????????????????http://blog.csdn.net/scorpiocj/article/details/6227528
?????????????????????????????????~