Suma de todos los elementos de la array menores que X y mayores que Y para consultas Q

Dada una array ordenada arr[] y un conjunto Q que tiene M consultas, donde cada consulta tiene valores X e Y , la tarea es encontrar la suma de todos los números enteros menores que X y mayores que Y presentes en la array.
Nota: X e Y pueden o no estar presentes en la array.

Ejemplos:

Entrada: arr[] = [3 5 8 12 15], Q = {{5, 12}, {4, 8}}
Salida:
18
30
Explicación:
Para la consulta 1, X = 5 e Y = 12. Suma = 3 ( < 5) + 15( > 12) = 18.
Para la consulta 2, X = 4 e Y = 8. Suma = 3( < 4) + 15 ( > 8) + 12 ( > 8) = 30.

Entrada: arr[] = [4 7 7 12 15], Q = {{3, 8}, {4, 8}}
Salida:
27
27
Explicación:
Para la consulta 1, X = 3 e Y = 8. Suma = 12 ( > 8) + 15 ( > 8) = 27.
Para la consulta 2, Suma = 12 + 15 = 27.

Acercarse:

  1. Cree una array de suma de prefijos donde prefix_sum[i] denota la suma de arr[0] + arr[1] + … arr[i] .
  2. Encuentre el último índice i que tiene un valor menor que X y extraiga la suma del prefijo hasta el i -ésimo índice. El índice se puede obtener en complejidad O(logN) usando bisect_left() o lower_bound() en Python y C++ respectivamente.
  3. De manera similar, encuentre el primer índice i en la array con un valor mayor que Y y calcule la suma prefix_sum[n-1] – prefix_sum[i-1] . Las funciones incorporadas bisect () y upper_bound() en Python y C++ respectivamente, realizan la operación requerida en O(logN) .
  4. La suma de los dos resultados calculados en los dos pasos anteriores es la respuesta requerida. Siga repitiendo estos pasos para cada consulta.

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

Python3

# Python code for the above program
from bisect import bisect, bisect_left
  
def createPrefixSum(ar, n):
  
    # Initialize prefix sum 
    # array
    prefix_sum = [0]*n
  
    # Initialize prefix_sum[0]
    # by ar[0]
    prefix_sum[0] = ar[0]
      
    # Compute prefix sum for
    # all indices    
    for i in range(1, n):
        prefix_sum[i] = prefix_sum[i-1]+ar[i]
    return prefix_sum
  
# Function to return sum of all
# elements less than X
def sumLessThanX(ar, x, prefix_xum):
  
    # Index of the last element 
    # which is less than x
    pos_x = bisect_left(ar, x) - 1
  
      
    if pos_x >= 0 :
        return prefix_sum[pos_x]
    # If no element is less than x
    else:
        return 0
  
# Function to return sum of all
# elements greater than Y
def sumGreaterThanY(ar, y, prefix_sum):
  
    # Index of the first element 
    # which is greater than y
    pos_y = bisect(ar, y)
    pos_y -= 1
  
    if pos_y < len(ar)-1 :
        return prefix_sum[-1]-prefix_sum[pos_y]
    # If no element is greater than y
    else:
        return 0
  
  
def solve(ar, x, y, prefix_sum):
    ltx = sumLessThanX(ar, x, prefix_sum)
    gty = sumGreaterThanY(ar, y, prefix_sum)
  
    # printing the final sum
    print(ltx + gty) 
  
  
def print_l(lb, ub):
    print("sum of integers less than {}".format(lb)
    + " and greater than {} is ".format(ub),
    end = '')
  
  
if __name__ == '__main__':
  
    # example 1
    ar = [3, 6, 6, 12, 15]
    n = len(ar)
    prefix_sum = createPrefixSum(ar, n)
  
    # for query 1
    q1x = 5
    q1y = 12
    print_l(q1x, q1y)
    solve(ar, q1x, q1y, prefix_sum)
  
    # for query 2
    q2x = 7
    q2y = 8
    print_l(q2x, q2y)
    solve(ar, q2x, q2y, prefix_sum)
Producción:

sum of integers less than 5 and greater than 12 is 18
sum of integers less than 7 and greater than 8 is 42


Complejidad de tiempo: O(N + (M * logN))
Complejidad de espacio auxiliar: O(N)

Publicación traducida automáticamente

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