Encuentre la suma de todos los elementos únicos en la array para consultas K

Dada una array arr[] en la que inicialmente todos los elementos son 0 y otra array Q[][] que contiene K consultas donde cada consulta representa un rango [L, R] , la tarea es agregar 1 a cada subarreglo donde se define cada subarreglo por el rango [L, R] y devuelve la suma de todos los elementos únicos .
Nota: La indexación basada en uno se usa en la array Q[][] para indicar los rangos.
Ejemplos: 
 

Entrada: arr[] = { 0, 0, 0, 0, 0, 0 }, Q[][2] = {{1, 3}, {4, 6}, {3, 4}, {3, 3 }} 
Salida:
Explicación: 
Inicialmente, la array es arr[] = { 0, 0, 0, 0, 0, 0 }. 
Consulta 1: arr[] = { 1, 1, 1, 0, 0, 0 }. 
Consulta 2: arr[] = { 1, 1, 1, 1, 1, 1 }. 
Consulta 3: arr[] = { 1, 1, 2, 2, 1, 1 }. 
Consulta 4: arr[] = { 1, 1, 3, 2, 1, 1 }. 
Por lo tanto, los elementos únicos son {1, 3, 2}. Por lo tanto suma = 1 + 3 + 2 = 6.
Entrada: arr[] = { 0, 0, 0, 0, 0, 0, 0, 0 }, Q[][2] = {{1, 4}, { 5, 5}, {7, 8}, {8, 8}} 
Salida:
Explicación: 
Inicialmente, la array es arr[] = { 0, 0, 0, 0, 0, 0, 0, 0 }. 
Después de procesar todas las consultas, arr[] = { 1, 1, 1, 1, 1, 0, 1, 2 }. 
Por lo tanto, los elementos únicos son {1, 0, 2}. Así suma = 1 + 0 + 2 = 3. 
 

Enfoque: La idea es incrementar el valor en 1 y disminuir la array en 1 en el índice L y R+1 respectivamente para procesar cada consulta. Luego, calcule la suma del prefijo de la array para encontrar la array final después de las consultas Q. Como se explica en este artículo. Finalmente, calcule la suma de los elementos únicos con la ayuda del mapa hash .
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ implementation to find the
// sum of all unique elements of
// the array after Q queries
 
#include <bits/stdc++.h>
 
using namespace std;
 
 
// Function to find the sum of
// unique elements after Q Query
int uniqueSum(int A[], int R[][2],
            int N, int M)
{
    // Updating the array after
    // processing each query
    for (int i = 0; i < M; ++i) {
 
        int l = R[i][0], r = R[i][1] + 1;
 
        // Making it to 0-indexing
        l--;
        r--;
        A[l]++;
 
        if (r < N)
            A[r]--;
    }
 
    // Iterating over the array
    // to get the final array
    for (int i = 1; i < N; ++i) {
        A[i] += A[i - 1];
    }
 
    // Variable to store the sum
    int ans = 0;
 
    // Hash to maintain previously
    // occurred elements
    unordered_set<int> s;
 
    // Loop to find the maximum sum
    for (int i = 0; i < N; ++i) {
 
        if (s.find(A[i]) == s.end())
            ans += A[i];
 
        s.insert(A[i]);
    }
 
    return ans;
}
 
// Driver code
int main()
{
    int A[] = { 0, 0, 0, 0, 0, 0 };
    int R[][2]
        = { { 1, 3 }, { 4, 6 },
            { 3, 4 }, { 3, 3 } };
 
    int N = sizeof(A) / sizeof(A[0]);
    int M = sizeof(R) / sizeof(R[0]);
 
    cout << uniqueSum(A, R, N, M);
 
    return 0;
}

Java

// Java implementation to find the
// sum of all unique elements of
// the array after Q queries
 
import java.util.*;
 
class GFG{
 
// Function to find the sum of
// unique elements after Q Query
static int uniqueSum(int A[], int R[][],
                     int N, int M)
{
    // Updating the array after
    // processing each query
    for (int i = 0; i < M; ++i)
    {
        int l = R[i][0], r = R[i][1] + 1;
 
        // Making it to 0-indexing
        l--;
        r--;
        A[l]++;
         
        if (r < N)
            A[r]--;
    }
 
    // Iterating over the array
    // to get the final array
    for (int i = 1; i < N; ++i)
    {
        A[i] += A[i - 1];
    }
 
    // Variable to store the sum
    int ans = 0;
 
    // Hash to maintain previously
    // occurred elements
    HashSet<Integer> s = new HashSet<Integer>();
 
    // Loop to find the maximum sum
    for (int i = 0; i < N; ++i)
    {
        if (!s.contains(A[i]))
            ans += A[i];
 
        s.add(A[i]);
    }
    return ans;
}
 
// Driver code
public static void main(String[] args)
{
    int A[] = { 0, 0, 0, 0, 0, 0 };
    int R[][] = { { 1, 3 }, { 4, 6 },
                  { 3, 4 }, { 3, 3 } };
    int N = A.length;
    int M = R.length;
    System.out.print(uniqueSum(A, R, N, M));
}
}
 
// This code is contributed by gauravrajput1

Python 3

# Python implementation to find the
# sum of all unique elements of
# the array after Q queries
 
# Function to find the sum of
# unique elements after Q Query
def uniqueSum(A, R, N, M) :
 
    # Updating the array after
    # processing each query
    for i in range(0, M) :
 
        l = R[i][0]
        r = R[i][1] + 1
 
        # Making it to 0-indexing
        l -= 1
        r -= 1
        A[l] += 1
 
        if (r < N) :
            A[r] -= 1
 
    # Iterating over the array
    # to get the final array
    for i in range(1, N) :
        A[i] += A[i - 1]
 
    # Variable to store the sum
    ans = 0
 
    # Hash to maintain previously
    # occurred elements
    s = {chr}
 
    # Loop to find the maximum sum
    for i in range(0, N) :
        if (A[i] not in s) :
            ans += A[i]
 
        s.add(A[i])
 
    return ans
 
# Driver code
A = [ 0, 0, 0, 0, 0, 0 ]
R = [ [ 1, 3 ], [ 4, 6 ],
      [ 3, 4 ], [ 3, 3 ] ]
N = len(A)
M = len(R)
 
print(uniqueSum(A, R, N, M))
 
# This code is contributed by Sanjit_Prasad

C#

// C# implementation to find the
// sum of all unique elements of
// the array after Q queries
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function to find the sum of
// unique elements after Q Query
static int uniqueSum(int []A, int [,]R,
                     int N, int M)
{
     
    // Updating the array after
    // processing each query
    for(int i = 0; i < M; ++i)
    {
       int l = R[i, 0], r = R[i, 1] + 1;
        
       // Making it to 0-indexing
       l--;
       r--;
       A[l]++;
        
       if (r < N)
           A[r]--;
    }
 
    // Iterating over the array
    // to get the readonly array
    for(int i = 1; i < N; ++i)
    {
       A[i] += A[i - 1];
    }
 
    // Variable to store the sum
    int ans = 0;
 
    // Hash to maintain previously
    // occurred elements
    HashSet<int> s = new HashSet<int>();
 
    // Loop to find the maximum sum
    for(int i = 0; i < N; ++i)
    {
       if (!s.Contains(A[i]))
           ans += A[i];
       s.Add(A[i]);
    }
    return ans;
}
 
// Driver code
public static void Main(String[] args)
{
    int []A = { 0, 0, 0, 0, 0, 0 };
    int [,]R = { { 1, 3 }, { 4, 6 },
                 { 3, 4 }, { 3, 3 } };
                  
    int N = A.Length;
    int M = R.GetLength(0);
     
    Console.Write(uniqueSum(A, R, N, M));
}
}
 
// This code is contributed by Princi Singh

Javascript

<script>
// Javascript implementation to find the
// sum of all unique elements of
// the array after Q queries
 
// Function to find the sum of
// unique elements after Q Query
function uniqueSum(A, R, N, M)
{
 
    // Updating the array after
    // processing each query
    for (let i = 0; i < M; ++i)
    {
        let l = R[i][0], r = R[i][1] + 1;
   
        // Making it to 0-indexing
        l--;
        r--;
        A[l]++;
           
        if (r < N)
            A[r]--;
    }
   
    // Iterating over the array
    // to get the final array
    for (let i = 1; i < N; ++i)
    {
        A[i] += A[i - 1];
    }
   
    // Variable to store the sum
    let ans = 0;
   
    // Hash to maintain previously
    // occurred elements
    let s = new Set();
   
    // Loop to find the maximum sum
    for (let i = 0; i < N; ++i)
    {
        if (!s.has(A[i]))
            ans += A[i];
   
        s.add(A[i]);
    }
    return ans;
}
 
// Driver code
      let A = [ 0, 0, 0, 0, 0, 0 ];
    let R = [[ 1, 3 ], [ 4, 6 ],
                  [ 3, 4 ], [ 3, 3 ]];
    let N = A.length;
    let M = R.length;
    document.write(uniqueSum(A, R, N, M));
 
// This code is contributed by code_hunt.
</script>
Producción: 

6

 

Complejidad temporal: O(M + N)

Espacio Auxiliar: O(N)

Publicación traducida automáticamente

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