G.cpp 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include <bits/stdc++.h>
  2. const int MAX = 500000;
  3. const int S = 2000000000;
  4. using namespace std;
  5. int L[MAX / 2 + 2], R[MAX / 2 + 2];
  6. int cnt;
  7. void merge(int A[], int n, int left, int mid, int right) {
  8. int n1 = mid - left;
  9. int n2 = right - mid;
  10. for (int i = 0; i < n1; i++) L[i] = A[left + i];
  11. for (int i = 0; i < n2; i++) R[i] = A[mid + i];
  12. L[n1] = R[n2] = S;
  13. int i = 0, j = 0;
  14. for (int k = left; k < right; k++) {
  15. cnt++;
  16. if (L[i] <= R[j]) {
  17. A[k] = L[i++];
  18. } else {
  19. A[k] = R[j++];
  20. }
  21. }
  22. }
  23. void mergesort(int A[], int n, int left, int right) {
  24. if (left + 1 < right) {
  25. int mid = (left + right) / 2;
  26. mergesort(A, n, left, mid);
  27. mergesort(A, n, mid, right);
  28. merge(A, n, left, mid, right);
  29. }
  30. }
  31. int main(int argc, char const *argv[]) {
  32. int A[MAX], n, i;
  33. cnt = 0;
  34. cin >> n;
  35. for (int i = 0; i < n; i++) {
  36. cin >> A[i];
  37. }
  38. mergesort(A, n, 0, n);
  39. for (i = 0; i < n; i++) {
  40. if (i) cout << " ";
  41. cout << A[i];
  42. }
  43. cout << endl;
  44. cout << cnt << endl;
  45. return 0;
  46. }