Bliski

Brojevi \(a\) i \(b\) su bliski ako \(|a − b| < d\). Data su dva niza brojeva dužine \(n\) i broj \(d\). Odrediti koliko elemenata prvog niza ima blizak broj u drugom nizu. Vremenska složenost algoritma treba da bude O(\(n \log n\)), a prostorna O(\(n\)).

Opis ulaza

Sa standardnog ulaza se unose brojevi n (\(1 \le n \le 1000000\)) i \(d\), zatim elementi prvog niza, a onda elementi drugog niza.

Opis izlaza

Na standardni izlaz ispisati traženi broj.

Primer

Ulaz

6 2 5 1 7 -5 10 13 12 0 3 -2 7 9

Izlaz

4

Rešenje

Opis rešenja

U nastavku su data dva rešenja. Prvo koristi tehniku dva pokazivača, a drugo binarnu pretragu.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
   int n;
   cin >> n;

   int d;
   cin >> d;
   
   vector<int> a(n);
   for (int i = 0; i < n; i++)
      cin >> a[i];
   
   vector<int> b(n);
   for (int i = 0; i < n; i++)
      cin >> b[i];
   
   sort(begin(a), end(a));
   sort(begin(b), end(b));
   
   int brojBliskih = 0;
   int j = 0;
   for (int i = 0; i < n; i++) {
      while (j < n && b[j] <= a[i] - d)
         j++;
      if (j < n && b[j] < a[i] + d)
         brojBliskih++;
   }
   
   cout << brojBliskih << endl;
   return 0;
}
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int bliski(int a, int b, int d) {
    return abs(a-b) < d;
}

int ima_bliskih(int x, const vector<int>& v, int d) {
    auto levo = upper_bound(begin(v), end(v), x - d);
    auto desno = lower_bound(begin(v), end(v), x + d);
    return levo < desno;
}

int main() {
    int n;
    cin >> n;
    int d;
    cin >> d;

    vector<int> a(n);
    for (int i = 0; i < n; i++)
        cin >> a[i];
    
    vector<int> b(n);
    for (int i = 0; i < n; i++)
        cin >> b[i];
    
    sort(begin(a), end(a));
    sort(begin(b), end(b));
    
    int broj_bliskih = 0;
    for(int x : a)
        if(ima_bliskih(x, b, d))
            broj_bliskih++;
    
    cout << broj_bliskih << endl;
    return 0;
}