Advertisement
Guest User

Untitled

a guest
May 25th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. #include <stdio.h>
  2. using namespace std;
  3.  
  4. int n;
  5.  
  6. void print(int* A, int L, int midL, int midR, int R)
  7. {
  8. for (int i = 0; i < n; i++)
  9. {
  10. if (i == L)
  11. printf("[");
  12. if (i - 1 == midL)
  13. printf("(");
  14. printf("%d", A[i]);
  15. if (i + 1 == midR)
  16. printf(")");
  17. if (i == R)
  18. printf("]");
  19. printf(" ");
  20. }
  21. printf("\n");
  22. }
  23.  
  24.  
  25. void partition(int* A, const int &MED, int L, int R, int &midL, int &midR)
  26. {
  27. int mid = L;
  28. while (mid <= R)
  29. {
  30. int tmp;
  31. if (A[mid] < MED)
  32. {
  33. tmp = A[L];
  34. A[L] = A[mid];
  35. A[mid] = tmp;
  36. L++;
  37. mid++;
  38. }
  39. else if (A[mid] == MED)
  40. {
  41. mid++;
  42. }
  43. else
  44. {
  45. tmp = A[R];
  46. A[R] = A[mid];
  47. A[mid] = tmp;
  48. R--;
  49. }
  50. }
  51.  
  52. midL = L - 1;
  53. midR = mid;
  54. }
  55.  
  56. void insertSort(int* A, const int &L, const int &R)
  57. {
  58. if (L == R)
  59. return;
  60. for (int i = L + 1; i <= R; i++)
  61. {
  62. int key = A[i];
  63. int j = i - 1;
  64. while (j >= 0 && A[j] > key)
  65. {
  66. A[j + 1] = A[j];
  67. j = j - 1;
  68. }
  69. A[j + 1] = key;
  70. }
  71. }
  72.  
  73.  
  74. int max(const int &a, const int &b)
  75. {
  76. return (a<b) ? b : a;
  77. }
  78. int min(const int &a, const int &b)
  79. {
  80. return (a>b) ? b : a;
  81. }
  82.  
  83. // https://stackoverflow.com/questions/480960/code-to-calculate-median-of-five-in-c-sharp
  84. int med3(int &a, int &b, int &c)
  85. {
  86. return max(min(a, b), min(c, max(a, b)));
  87. }
  88.  
  89. int med5(int &a, int &b, int &c, int &d, int &e)
  90. {
  91. int f = max(min(a, b), min(c, d));
  92. int g = min(max(a, b), max(c, d));
  93. return med3(e, f, g);
  94. }
  95.  
  96. int smallMedian(int* A, const int &L, const int &R)
  97. {
  98. if (L - R != 5)
  99. {
  100. insertSort(A, L, R);
  101. return A[L + (R - L) / 2];
  102. }
  103. else
  104. {
  105. return med5(A[L], A[L + 1], A[L + 2], A[L + 3], A[L + 4]);
  106. }
  107. }
  108.  
  109. int medianOfMedians(int* A, int* medians, int L, int R)
  110. {
  111. if (R - L <= 10)
  112. {
  113. return smallMedian(A, L, R);
  114. }
  115.  
  116. int medSize = (R - L + 4) / 5;
  117.  
  118. int i = 0;
  119. int j = 0;
  120. for (; i < medSize - 1; i++, j += 5)
  121. medians[i] = smallMedian(A, L + j, L + j + 4);
  122. medians[i] = smallMedian(A, L + j, R);
  123.  
  124. return medianOfMedians(medians, medians, 0, medSize - 1);
  125. }
  126.  
  127. int kth(int* A, int* medians, int k, int L, int R)
  128. {
  129. if (R - L < 10)
  130. {
  131. insertSort(A, L, R);
  132. return A[k];
  133. }
  134.  
  135. int MED = medianOfMedians(A, medians, L, R);
  136. int midL;
  137. int midR;
  138. //printf("%d %d\n", MED, k);
  139. partition(A, MED, L, R, midL, midR);
  140. //print(A, L, midL, midR, R);
  141.  
  142. if (midL < k && k < midR)
  143. {
  144. //printf("{0}");
  145. return A[midL + 1];
  146. }
  147. else
  148. {
  149. if (k <= midL)
  150. {
  151. //printf("{-1}");
  152. return kth(A, medians, k, L, midL);
  153. }
  154. else
  155. {
  156. //printf("{1}");
  157. return kth(A, medians, k, midR, R);
  158. }
  159. }
  160. }
  161.  
  162. int main()
  163. {
  164. int z, k;
  165. scanf("%d", &z);
  166. while (z--)
  167. {
  168. scanf("%d %d", &n, &k);
  169. k--;
  170. int* A = new int[n];
  171. int* medians = new int[n / 5 + 1];
  172. for (int i = 0; i < n; i++)
  173. scanf("%d", &A[i]);
  174. printf("%d\n", kth(A, medians, k, 0, n - 1));
  175. //printf("\n");
  176. delete[] A;
  177. delete[] medians;
  178. }
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement