Tutaq ki, massivində tramvaylarla daşınan insanların sayı haqqında statistik məlumatlar var. Daşınan insanlar sayına görə hər üçün həmin dəyərin göründüyü indekslərin vektorunu saxlayırıq. Başqa sözlə, map təsvirində , il ərzində dəqiq olaraq insan daşınan şəhərlərin nömrələrini saxlayır.
Sorğu (l, r, x) formasında aşağıdakı kimi işə salınır:
Əgər dəyəri map strukturunda yoxdursa, dərhal '' qaytarırıq.
Əks halda, ikili axtarış lower_bound ilə massivində -dən kiçik olmayan ilk indeksə baxırıq.
Əgər tapılan indeks -dən böyük deyil, deməli, şəhərlər arasında -dan -ə qədər olan nömrələr arasında dəyəri həqiqətən mövcuddur.
Misal
Birinci misal üçün strukturunun necə görünəcəyinə baxaq.
p[123] = \{1\};
p[314] = \{3\};
p[434] = \{5\};
p[666] = \{2, 4\};
Məsələn, (1, 5, 314) sorğusunu yaymaq üçün aşağıdakı addımları edin:
massivinin mövcudluğunu yoxlayırıq;
Daha sonra ikili axtarış istifadə edərək, massivində l = 1-dən kiçik olmayan ən kiçik dəyəri tapırıq. Bu halda bu dəyər -dir.
Çünki r = 5-dən çox deyil, cavab olaraq '' qaytarılır.
Alqoritmin realizə olunması
İstifadə olunan məlumat strukturlarını yaradaq:
massivi tramvaylarla daşınmış insanların sayını saxlayır;
təsviri isə daxilində tapılan hər dəyəri üçün indekslərin (pozisiyalar) siyahısını saxlayır.
vector<int> v;
map<int, vector<int>> p;Giriş məlumatları oxuyuruq.
cin >> n;
v.resize(n + 1);
for (i = 1; i <= n; i++)
{
cin >> v[i];nömrəli şəhərdə insan daşınıb. Şəhərlər -dən başlayaraq nömrələnir.
p[v[i]].push_back(i);
}Sorğu sayını oxuyuruq.
cin >> q;Cavabı sətirində yaradacağıq.
result = "";Ardıcıllıqla sorğularını (l, r, x) emal edirik.
for (i = 0; i < q; i++)
{
cin >> l >> r >> x;Əgər heç bir şəhərdə qədər sərnişin daşınmayıbsa, cavaba '' yazırıq.
if (p.find(x) == p.end())
{
result += '0';
continue;
}massivində -dən -ə qədər olan ən az bir rəqəmin olub-olmadığını müəyyən etməliyik. daxilində -dən kiçik olmayan ilk tapılanı axtarırıq.
vector<int>::iterator it = lower_bound(p[x].begin(), p[x].end(), l);Əgər belə bir rəqəm mövcuddursa və -dən böyük deyilsə, cavaba '' yazırıq.
if (it != p[x].end() && *it <= r)
result += '1';
else
result += '0';
}Cavabı çap edirik.
cout << result << endl;