Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- int less(const int* a, int value, int size, bool flag) {
- int l = -1, r = size;
- while (l < r - 1) {
- int m = (l + r) / 2;
- if (a[m] < value || a[m] == value && flag) {
- l = m;
- } else {
- r = m;
- }
- }
- return r;
- }
- int medianInFirst(const int* a, const int* b, int size, int index) {
- int i = -1, jmin, jmax;
- int l = 0, r = size;
- while (1) {
- if (i == (l + r) / 2) {
- return -1;
- }
- i = (l + r) / 2;
- jmin = less(b, a[i], size, 0) + less(a, a[i], size, 0);
- jmax = less(b, a[i], size, 1) + less(a, a[i], size, 1) - 1;
- if (jmin <= index && jmax >= index) {
- return i;
- }
- if (jmax < index) {
- l = i;
- } else {
- r = i;
- }
- }
- }
- double median(const int* a, const int* b, int size) {
- int medians[2];
- for (int i = 0; i < 2; ++i) {
- int temp = medianInFirst(a, b, size, size - 1 + i);
- if (temp == -1) {
- temp = medianInFirst(b, a, size, size - 1 + i);
- medians[i] = b[temp];
- } else {
- medians[i] = a[temp];
- }
- }
- return static_cast<double>(medians[0] + medians[1]) / 2;
- }
- int main() {
- std::ios_base::sync_with_stdio(false);
- std::cout << std::fixed << std::setprecision(5);
- std::cin.tie(nullptr);
- int n, m;
- std::cin >> n >> m;
- int** vecs = new int*[n];
- for (int i = 0; i < n; ++i) {
- vecs[i] = new int[m];
- for (int j = 0; j < m; ++j) {
- std::cin >> vecs[i][j];
- }
- }
- for (int i = 0; i < n - 1; ++i) {
- for (int j = i + 1; j < n; ++j) {
- std::cout << median(vecs[i], vecs[j], m) << "\n";
- }
- }
- for (int i = 0; i < n; ++i) {
- delete[] vecs[i];
- }
- delete[] vecs;
- }
Advertisement
Add Comment
Please, Sign In to add comment