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\)).
Sa standardnog ulaza se unose brojevi n (\(1 \le n \le 1000000\)) i \(d\), zatim elementi prvog niza, a onda elementi drugog niza.
Na standardni izlaz ispisati traženi broj.
6 2 5 1 7 -5 10 13 12 0 3 -2 7 9
4
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;
}