Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
不同的归并求逆序,一个超时一个400MS.请问大家如何应对这种问题呢? #include <stdio.h> #include <stdlib.h> #include <string.h> typedef long long LL; LL swap_cnt; int backup[500002]; int vec[500002]; void sub_merge2(int s, int m, int e)//从后向前的合并超时 { int i = m, j = e, k = e; while (i >= s && j >= (m + 1)) { if (vec[i] > vec[j]) { swap_cnt += j - m; backup[k--] = vec[i--]; } else { backup[k--] = vec[j--]; } } while (i >= 0) backup[k--] = vec[i--]; while (j >= (m + 1)) backup[k--] = vec[j--]; memcpy(vec + s, backup + s, sizeof(*backup) * (e - s + 1)); } void sub_merge(int s, int m, int e) //从前向后合并,400MS { int i = s, j = m + 1, k = s; while (i <= m && j <= e) { if (vec[i] > vec[j]) { swap_cnt += m - i + 1; backup[k++] = vec[j++]; } else { backup[k++] = vec[i++]; } } while (i <= m) backup[k++] = vec[i++]; while (j <= e) backup[k++] = vec[j++]; memcpy(vec + s, backup + s, sizeof(*backup) * (e - s + 1)); } void merge(int s, int e) { if (s >= e) return; int m = (s + e) / 2; merge(s, m); merge(m + 1, e); sub_merge2(s, m, e); return; } int main() { long i, n; while (scanf("%ld", &n) == 1 && n != 0) { for (i = 0; i < n; i++) scanf("%ld", &(vec[i])); swap_cnt = 0; merge(0, n - 1); printf("%lld\n", swap_cnt); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator