Rezolvare completă PbInfo #2276 cb

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 Adresa de email.

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!