3o_3v

medians of n sorted vectors

Nov 15th, 2022
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3.  
  4. int less(const int* a, int value, int size, bool flag) {
  5.     int l = -1, r = size;
  6.     while (l < r - 1) {
  7.         int m = (l + r) / 2;
  8.         if (a[m] < value || a[m] == value && flag) {
  9.             l = m;
  10.         } else {
  11.             r = m;
  12.         }
  13.     }
  14.     return r;
  15. }
  16.  
  17. int medianInFirst(const int* a, const int* b, int size, int index) {
  18.     int i = -1, jmin, jmax;
  19.     int l = 0, r = size;
  20.     while (1) {
  21.         if (i == (l + r) / 2) {
  22.             return -1;
  23.         }
  24.         i = (l + r) / 2;
  25.         jmin = less(b, a[i], size, 0) + less(a, a[i], size, 0);
  26.         jmax = less(b, a[i], size, 1) + less(a, a[i], size, 1) - 1;
  27.         if (jmin <= index && jmax >= index) {
  28.             return i;
  29.         }
  30.         if (jmax < index) {
  31.             l = i;
  32.         } else {
  33.             r = i;
  34.         }
  35.     }
  36. }
  37.  
  38. double median(const int* a, const int* b, int size) {
  39.     int medians[2];
  40.     for (int i = 0; i < 2; ++i) {
  41.         int temp = medianInFirst(a, b, size, size - 1 + i);
  42.         if (temp == -1) {
  43.             temp = medianInFirst(b, a, size, size - 1 + i);
  44.             medians[i] = b[temp];
  45.         } else {
  46.             medians[i] = a[temp];
  47.         }
  48.     }
  49.     return static_cast<double>(medians[0] + medians[1]) / 2;
  50. }
  51.  
  52. int main() {
  53.     std::ios_base::sync_with_stdio(false);
  54.     std::cout << std::fixed << std::setprecision(5);
  55.     std::cin.tie(nullptr);
  56.     int n, m;
  57.     std::cin >> n >> m;
  58.     int** vecs = new int*[n];
  59.     for (int i = 0; i < n; ++i) {
  60.         vecs[i] = new int[m];
  61.         for (int j = 0; j < m; ++j) {
  62.             std::cin >> vecs[i][j];
  63.         }
  64.     }
  65.     for (int i = 0; i < n - 1; ++i) {
  66.         for (int j = i + 1; j < n; ++j) {
  67.             std::cout << median(vecs[i], vecs[j], m) << "\n";
  68.         }
  69.     }
  70.     for (int i = 0; i < n; ++i) {
  71.         delete[] vecs[i];
  72.     }
  73.     delete[] vecs;
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment