Advertisement
kornelhowil

1A2018

Feb 6th, 2021
903
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.20 KB | None | 0 0
  1. /*
  2.     Złożoność czasowa: O(n*log(z))
  3.     Złożoność pamięciowa: O(1)
  4. */
  5.  
  6. #include <stdio.h>
  7. /*
  8.     Liczy ile jest i, j takich, że A[i] + B[j] <= t
  9.     Złożoność O(n), bo przechodzimy obie tablice jednocześnie
  10. */
  11. int mniejszesumy(int A[], int B[], int t, int n)
  12. {
  13.     int b = n - 1;
  14.     int mniejsze = 0;
  15.     for (int a = 0; a < n; a++) {
  16.         while (b >= 0 && A[a] + B[b] > t)
  17.             b--;
  18.         mniejsze += (b + 1);
  19.     }
  20.     return mniejsze;
  21. }
  22. /*
  23.     Binsearchuje po wszystkich możliwych sumach od A[0]+B[0] do A[n-1]+B[n-1] i szuka takiej sumy S, że mniejszesumy(s) > n^2/2
  24.     Złożoność czasowa: O(n*log(z)), bo używamy binsearcha w tablicy o wielkości z, ale przy każdym przeszukaniu używamy mniejszesumy o złożoności O(n)
  25. */
  26. int mediana(int A[], int B[], int n)
  27. {
  28.     int l = A[0] + B[0];
  29.     int r = A[n - 1] + B[n - 1];
  30.  
  31.     while (l != r) {
  32.         int mid = (l + r) / 2;
  33.         if (mniejszesumy(A, B, mid, n) >= ((n * n) / 2))
  34.             r = mid;
  35.         else
  36.             l = mid + 1;
  37.     }
  38.     return l;
  39. }
  40.  
  41. int main(void)
  42. {
  43.     int n;
  44.     scanf("%d", &n);
  45.     int A[n];
  46.     int B[n];
  47.  
  48.     for (int i = 0; i < n; i++)
  49.         scanf("%d", &A[i]);
  50.     for (int i = 0; i < n; i++)
  51.         scanf("%d", &B[i]);
  52.  
  53.     printf("%d\n", mediana(A, B, n));
  54.     return 0;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement