Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- //jakieś skrajne przypadki mogą się psuć, ale to już szczegóły i nie chce mi się sprawdzać
- // A[j + 1] - A[j] < A[j + 2] - A[j + 1]
- // -B[j + 1] + B[j] < -B[j + 2] + B[j + 1]
- // czyli
- // (A[j + 1] - B[j + 1]) - (A[j] - B[j]) < (A[j + 2] - B[j + 2]) - (A[j + 1] - B[j + 1])
- // "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
- int tesame (int n, int A[], int B[])
- {
- int l = 0;
- int r = n - 1;
- // szukamy lewego minimum
- while (l < r) {
- int mid = (r + l) / 2;
- if (A[mid] - B[mid] > A[mid + 1] - B[mid + 1])
- l = mid + 1;
- else
- r = mid;
- }
- int min = l;
- int licznik = 0;
- // rozważamy malejący ciąg 0, 1, ... min i szukamy w nim 0
- l = 0;
- r = min;
- while (l < r) {
- int mid = (r + l) / 2;
- if (A[mid] - B[mid] > 0)
- l = mid + 1;
- else
- r = mid;
- }
- if (A[l] - B[l] == 0)
- licznik++;
- // rozważamy rosnący ciąg min+1, min+2, ..., n-1 i szukamy w nim 0
- l = min + 1;
- r = n - 1;
- while (l < r) {
- int mid = (r + l) / 2;
- if (A[mid] - B[mid] < 0)
- l = mid + 1;
- else
- r = mid;
- }
- if (A[l] - B[l] == 0)
- licznik++;
- return licznik;
- }
- int main()
- {
- int n;
- scanf("%d", &n);
- int A[n];
- int B[n];
- for (int i = 0; i < n; i++)
- scanf("%d", &A[i]);
- for (int i = 0; i < n; i++)
- scanf("%d", &B[i]);
- printf("%d\n", tesame(n, A, B));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement