Advertisement
alisadafi

Median-D&C

Nov 17th, 2023 (edited)
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <iomanip>
  5.  
  6. using namespace std;
  7.  
  8. pair<int, int> get_mid_members_of_even_length_array(const vector<int>& arr, int l, int h) {
  9.     return make_pair(arr[(l + h) / 2], arr[(l + h) / 2 + 1]);
  10. }
  11.  
  12. double get_median_of_sorted_array(const vector<int>& arr, int l, int h) {
  13.     int size = h - l + 1;
  14.  
  15.     if (size % 2 == 0) {
  16.         pair<int, int> mid_members = get_mid_members_of_even_length_array(arr, l, h);
  17.         return (mid_members.first + mid_members.second) / 2.0;
  18.     } else {
  19.         return arr[(l + h) / 2];
  20.     }
  21. }
  22.  
  23. double find_median_of_sorted_arrays(const vector<int>& arr1, const vector<int>& arr2, int l1, int h1, int l2, int h2) {
  24.     int size = h1 - l1 + 1;
  25.  
  26.     if (size == 0) {
  27.         return 0;
  28.     }
  29.  
  30.     if (size == 1) {
  31.         return (arr1[l1] + arr2[l2]) / 2.0;
  32.     }
  33.  
  34.     if (size == 2) {
  35.         return (max(arr1[l1], arr2[l2]) + min(arr1[h1], arr2[h2])) / 2.0;
  36.     }
  37.  
  38.     if (size % 2 == 0) {
  39.         pair<int, int> mid_arr1 = get_mid_members_of_even_length_array(arr1, l1, h1);
  40.         pair<int, int> mid_arr2 = get_mid_members_of_even_length_array(arr2, l2, h2);
  41.  
  42.         if (mid_arr1.first >= mid_arr2.first && mid_arr1.second <= mid_arr2.second) {
  43.             return get_median_of_sorted_array(arr1, l1, h1);
  44.         }
  45.  
  46.         if (mid_arr1.first <= mid_arr2.first && mid_arr1.second >= mid_arr2.second) {
  47.             return get_median_of_sorted_array(arr2, l2, h2);
  48.         }
  49.     }
  50.  
  51.     double med_arr1 = get_median_of_sorted_array(arr1, l1, h1);
  52.     double med_arr2 = get_median_of_sorted_array(arr2, l2, h2);
  53.  
  54.     if (med_arr1 == med_arr2) {
  55.         return med_arr1;
  56.     }
  57.  
  58.     if (med_arr1 < med_arr2) {
  59.         return find_median_of_sorted_arrays(arr1, arr2, ceil((l1 + h1) / 2.0), h1, l2, (l2 + h2) / 2);
  60.     }
  61.  
  62.     return find_median_of_sorted_arrays(arr1, arr2, l1, (l1 + h1) / 2, ceil((l2 + h2) / 2.0), h2);
  63. }
  64.  
  65. int main() {
  66.     int n;
  67.     cin >> n;
  68.  
  69.     vector<int> arr1(n);
  70.     vector<int> arr2(n);
  71.  
  72.     for (int i = 0; i < n; i++) {
  73.         cin >> arr1[i];
  74.     }
  75.  
  76.     for (int i = 0; i < n; i++) {
  77.         cin >> arr2[i];
  78.     }
  79.  
  80.     double ans = find_median_of_sorted_arrays(arr1, arr2, 0, n - 1, 0, n - 1);
  81.     int intPart = static_cast<int>(ans);
  82.     int floatPart = static_cast<int>((ans - intPart) * 10);
  83.  
  84.     cout << intPart << "." << floatPart << endl;
  85.  
  86.     return 0;
  87. }
  88.  
Tags: D&C
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement