Se consideră un șir a[1]
, a[2]
, …, a[n]
de numere naturale. Se dau și T
intervale închise de forma [x, y]
, cu x ≤ y
.
Cerința
Pentru fiecare din cele T
intervale de forma [x, y]
trebuie să răspundeți la întrebarea: câte numere din șir aparțin intervalului [x, y]
?
Date de intrare
Programul citește de la tastatură numerele n
și T
, apoi n
numere naturale, separate prin spații, a[1]
, a[2]
, …, a[n]
. Pe următoarele T
linii se află câte două numere naturale x
și y
reprezentând un interval [x, y]
.
Date de ieșire
Programul va afișa pe ecran T linii. Pe fiecare linie i
(i=1..T
) se va afla un singur număr natural reprezentând răspunsul la a i
-a întrebare.
Restricții și precizări
1 ≤ n, T ≤ 200 000
0 ≤ a[i] ≤ 2 000 000 000
0 ≤ x ≤ y ≤ 2 000 000 000
Exemplu
Intrare
9 7 6 1 3 5 3 3 9 20 9 4 10 0 100 0 1 500 506 3 3 10 18 3 9
Ieșire
4 9 1 0 3 0 7
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema cb:
/**
Complexitate O(n log n + T log n)
*/
#include <bits/stdc++.h>
#define nmax 200003
using namespace std;
int a[nmax], n;
/// cauta binar cea mai din stanga pozitie p
/// cu proprietatea ca x <= a[p]
int CautBin1(int x)
{
if (a[n] < x) return n + 1;
if (x <= a[1]) return 1;
int st, dr, m, p;
st = 1; dr = n; p = 1;
while (st <= dr)
{
m = (st + dr) / 2;
if (x <= a[m])
{
p = m; dr = m - 1;
}
else st = m + 1;
}
return p;
}
/// cauta binar cea mai din dreapta pozitie p
/// cu proprietatea ca a[p] <= y
int CautBin2(int y)
{
if (a[n] <= y) return n;
if (a[1] > y) return 0;
int st, dr, m, p;
st = 1; dr = n; p = 1;
while (st <= dr)
{
m = (st + dr) / 2;
if (a[m] <= y)
{
p = m; st = m + 1;
}
else dr = m - 1;
}
return p;
}
int main()
{
int i, p, q, T, x, y;
cin >> n >> T;
for (i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + n + 1);
while (T--)
{
cin >> x >> y;
p = CautBin1(x);
q = CautBin2(y);
cout << (q - p + 1) << "\n";
}
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2276 cb
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2276 cb de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!