Advertisement
kornelhowil

zad1_2_2016

Dec 16th, 2020 (edited)
753
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.44 KB | None | 0 0
  1. #include <stdio.h>
  2. //jakieś skrajne przypadki mogą się psuć, ale to już szczegóły i nie chce mi się sprawdzać
  3.  
  4. // A[j + 1] - A[j] < A[j + 2] - A[j + 1]
  5. // -B[j + 1] + B[j] < -B[j + 2] + B[j + 1]
  6. // czyli
  7. // (A[j + 1] - B[j + 1]) - (A[j] - B[j]) < (A[j + 2] - B[j + 2]) - (A[j + 1] - B[j + 1])
  8. // "pochodna" różnic ciągów jest rosnąca, czyli jest to ciąg antybitoniczny z tym, że dwa elementy w minimum mogą być takie same
  9.  
  10. int tesame (int n, int A[], int B[])
  11. {
  12.     int l = 0;
  13.     int r = n - 1;
  14.     // szukamy lewego minimum
  15.     while (l < r) {
  16.         int mid = (r + l) / 2;
  17.         if (A[mid] - B[mid] > A[mid + 1] - B[mid + 1])
  18.             l = mid + 1;
  19.         else
  20.             r = mid;
  21.     }
  22.     int min = l;
  23.  
  24.     int licznik = 0;
  25.  
  26.     // rozważamy malejący ciąg 0, 1, ... min i szukamy w nim 0
  27.     l = 0;
  28.     r = min;
  29.  
  30.     while (l < r) {
  31.         int mid = (r + l) / 2;
  32.         if (A[mid] - B[mid] > 0)
  33.             l = mid + 1;
  34.         else
  35.             r = mid;
  36.     }
  37.     if (A[l] - B[l] == 0)
  38.         licznik++;
  39.  
  40.     // rozważamy rosnący ciąg min+1, min+2, ..., n-1 i szukamy w nim 0
  41.     l = min + 1;
  42.     r = n - 1;
  43.  
  44.     while (l < r) {
  45.         int mid = (r + l) / 2;
  46.         if (A[mid] - B[mid] < 0)
  47.             l = mid + 1;
  48.         else
  49.             r = mid;
  50.     }
  51.     if (A[l] - B[l] == 0)
  52.         licznik++;
  53.  
  54.     return licznik;
  55. }
  56.  
  57.  
  58. int main()
  59. {
  60.     int n;
  61.     scanf("%d", &n);
  62.  
  63.     int A[n];
  64.     int B[n];
  65.  
  66.     for (int i = 0; i < n; i++)
  67.         scanf("%d", &A[i]);
  68.  
  69.     for (int i = 0; i < n; i++)
  70.         scanf("%d", &B[i]);
  71.  
  72.     printf("%d\n", tesame(n, A, B));
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement