Número de elementos menores o iguales a un número dado en un subarreglo dado

Dada una array ‘a[]’ y un número de consultas q. Cada consulta se puede representar mediante l, r, x. Su tarea es imprimir el número de elementos menores o iguales a x en el subarreglo representado por l a r. Ejemplos:

Input : arr[] = {2, 3, 4, 5}
            q = 2
            0 3 5
            0 2 2 
Output : 4
         1
Number of elements less than or equal to
5 in arr[0..3] is 4 (all elements)

Number of elements less than or equal to
2 in arr[0..2] is 1 (only 2)

Enfoque ingenuo El enfoque ingenuo para cada consulta atraviesa el subarreglo y cuenta el número de elementos que están en el rango dado. Enfoque eficiente La idea es utilizar el árbol de índices binarios . Tenga en cuenta que en los siguientes pasos x es el número según el cual debe encontrar los elementos y el subarreglo está representado por l, r. Paso 1: ordene la array en orden ascendente. Paso 2: ordene las consultas según x en orden ascendente, inicialice la array de bits como 0. Paso 3: comience desde la primera consulta y recorra la array hasta que el valor de la array sea menor que x. Para cada uno de estos elementos, actualice el BIT con un valor igual a 1 Paso 4: consulte la array de BIT en el rango de l a r 

CPP

// C++ program to answer queries to count number
// of elements smaller than or equal to x.
#include<bits/stdc++.h>
using namespace std;
 
// structure to hold queries
struct Query
{
    int l, r, x, idx;
};
 
// structure to hold array
struct ArrayElement
{
    int val, idx;
};
 
// bool function to sort queries according to k
bool cmp1(Query q1, Query q2)
{
    return q1.x < q2.x;
}
 
// bool function to sort array according to its value
bool cmp2(ArrayElement x, ArrayElement y)
{
    return x.val < y.val;
}
 
// updating the bit array
void update(int bit[], int idx, int val, int n)
{
    for (; idx<=n; idx +=idx&-idx)
        bit[idx] += val;
}
 
// querying the bit array
int query(int bit[], int idx, int n)
{
    int sum = 0;
    for (; idx > 0; idx -= idx&-idx)
        sum += bit[idx];
    return sum;
}
 
void answerQueries(int n, Query queries[], int q,
                              ArrayElement arr[])
{
    // initialising bit array
    int bit[n+1];
    memset(bit, 0, sizeof(bit));
 
    // sorting the array
    sort(arr, arr+n, cmp2);
 
    // sorting queries
    sort(queries, queries+q, cmp1);
 
    // current index of array
    int curr = 0;
 
    // array to hold answer of each Query
    int ans[q];
 
    // looping through each Query
    for (int i=0; i<q; i++)
    {
        // traversing the array values till it
        // is less than equal to Query number
        while (arr[curr].val <= queries[i].x && curr<n)
        {
            // updating the bit array for the array index
            update(bit, arr[curr].idx+1, 1, n);
            curr++;
        }
 
        // Answer for each Query will be number of
        // values less than equal to x upto r minus
        // number of values less than equal to x
        // upto l-1
        ans[queries[i].idx] = query(bit, queries[i].r+1, n) -
                              query(bit, queries[i].l, n);
    }
 
    // printing answer for each Query
    for (int i=0 ; i<q; i++)
        cout << ans[i] << endl;
}
 
// driver function
int main()
{
    // size of array
    int n = 4;
 
    // initialising array value and index
    ArrayElement arr[n];
    arr[0].val = 2;
    arr[0].idx = 0;
    arr[1].val = 3;
    arr[1].idx = 1;
    arr[2].val = 4;
    arr[2].idx = 2;
    arr[3].val = 5;
    arr[3].idx = 3;
 
    // number of queries
    int q = 2;
    Query queries[q];
    queries[0].l = 0;
    queries[0].r = 2;
    queries[0].x = 2;
    queries[0].idx = 0;
    queries[1].l = 0;
    queries[1].r = 3;
    queries[1].x = 5;
    queries[1].idx = 1;
 
    answerQueries(n, queries, q, arr);
 
    return 0;
}

Producción:

1
4

Este artículo es una contribución de Ayush Jha . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *