Cuente números en el rango [L, R] que tienen solo tres bits establecidos

Dada una array arr[] de N pares , donde cada elemento de la array denota una consulta de la forma {L, R}, la tarea es encontrar el recuento de números en el rango [L, R] , que tiene solo 3 bits establecidos para cada consulta {L, R}.

Ejemplos:

Entrada: arr[]={{11, 19}, {14, 19}}
Salida:  4
             2
Explicación: 

  1. Consulta (11, 19): los números en el rango [11, 19] que tienen tres bits establecidos son {11, 13, 14, 19}.
  2. Consulta (14, 19): los números en el rango [14, 19] que tienen tres bits establecidos son {14, 19}.

Entrada: arr[]={{1, 10}, {6, 12}}
Salida:  1
              2
Explicación: 

  1. Consulta (1, 10): los números en el rango [1, 10] que tienen tres bits establecidos son {7}.
  2. Consulta (6, 12): los números en el rango [6, 12] que tienen tres bits establecidos son {7, 12}.

Enfoque: la idea para resolver este problema es hacer un cálculo previo y almacenar todos los números con solo 3 bits establecidos en el rango [1, 10 18 ] , y luego usar la búsqueda binaria para encontrar la posición del límite inferior de L y el límite superior de R y devolver la respuesta ya que hay diferencia. Siga los pasos a continuación para resolver el problema dado:

  • Inicialice un vector , digamos V , para almacenar todos los números en el rango [1, 10 18 ] con solo tres bits configurados.
  • Iterar sobre cada triplete formado por la relación [0, 63] × [0, 63] × [0, 63] usando las variables i, j y k y realizar los siguientes pasos:
    • Si i, j y k son distintos, calcule el número con los bits i , j y k establecidos , y si el número es menor que 10 18 , inserte el número en el vector V.
  • Ordena el vector V en orden ascendente.
  • Recorra el arreglo arr[], usando la variable i, y realice los siguientes pasos:
    • Almacene los límites de la consulta en las variables, digamos L y R , respectivamente.
    • Encuentre la posición del límite inferior de L y el límite superior de R en el vector V .
    • Imprime la diferencia entre las posiciones del límite superior de R y el límite inferior de L , como resultado.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to precompute
void precompute(vector<long long>& v)
{
    // Iterate over the range [0, 64]
    for (long long i = 0; i < 64; i++) {
        // Iterate over the range [0, 64]
        for (long long j = i + 1; j < 64; j++) {
            // Iterate over the range [0, 64]
            for (long long k = j + 1; k < 64; k++) {
  
                // Stores the number with set bits
                // i, j, and k
                long long int x
                    = (1LL << i) | (1LL << j) | (1LL << k);
  
                // Check if the number is less
                // than 1e18
                if (x <= 1e18 && x > 0)
                    v.push_back(x);
            }
        }
    }
  
    // Sort the computed vector
    sort(v.begin(), v.end());
}
  
// Function to count number in the range
// [l, r] having three set bits
long long query(long long l, long long r,
                vector<long long>& v)
{
    // Find the lowerbound of l in v
    auto X = lower_bound(v.begin(), v.end(), l);
  
    // Find the upperbound of l in v
    auto Y = upper_bound(v.begin(), v.end(), r);
  
    // Return the difference
    // in their positions
    return (Y - X);
}
void PerformQuery(vector<pair<long long, long long> > arr,
                  int N)
{
  
    // Stores all the numbers in the range
    // [1, 1e18] having three set bits
    vector<long long> V;
  
    // Function call to perform the
    // precomputation
    precompute(V);
  
    // Iterate through each query
    for (auto it : arr) {
        long long L = it.first;
        long long R = it.second;
  
        // Print the answer
        cout << query(L, R, V) << "\n";
    }
}
  
// Driver Code
int main()
{
  
    // Input
    vector<pair<long long, long long> > arr
        = { { 11, 19 }, { 14, 19 } };
    int N = arr.size();
  
    // Function call
    PerformQuery(arr, N);
  
    return 0;
}
Producción

4
2

Complejidad de tiempo: 3

Publicación traducida automáticamente

Artículo escrito por UtkarshPandey6 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 *