Encuentre el elemento Array restante después de agregar valores en rangos dados

Dada una array A[] que contiene N elementos y una array de consultas que contiene Q consultas de tipo [ X, L, R ] donde X es el elemento que se agregará a todos los elementos en el rango [L, R] . Después de realizar todas las consultas Q , continúe eliminando dos elementos de la array y agregue su suma en la array hasta que el tamaño de la array sea 1. La tarea es encontrar este elemento restante de la array.

Nota: Se considera la indexación basada en 1.

Ejemplo:

Aporte: A[] = [ 1, 4, 3, 2, 4 ], consultas = [ [5, 1, 2 ], [ -5, 1, 3 ] ]
Salida: 9
Explicación: 
1ra consulta: sumando 5 a la primera y segundo elemento, A se convierte en {6, 9, 3, 2, 4}.
Segunda consulta: sumando -5 al primer, segundo y tercer elemento, A se convierte en {1, 4, -2, 2, 4}.
Operación 1: seleccione A1=1 y A3 = -2, elimínelos y 
agregue su suma (1-2=-1) a la array, A se convierte en {4, 2, 4, -1}.
Operación 2: seleccione A2=2 y A3 = -1, elimínelos y 
agregue su suma (2-1=1) a la array, A se convierte en {4, 4, 1}.
Operación 3: seleccione A1=4 y A3=1, elimínelos y 
agregue su suma (4+1=5) a la array, A se convierte en {4, 5}.
Operación 4: Seleccionar los dos elementos restantes y 
suma su suma (4+5 = 9) a la array, A se convierte en {9}.

Entrada:  A = [1, 2, 3], consultas = [ [-3, 1, 3 ] ]
Salida: -3

 

Enfoque ingenuo:

Primero calcule la array A para todas las consultas Q recorriéndolas y agregando queries[i][0] from queries[i][1]-1 to queries[i][2]-1

Luego, la selección de los elementos debe ser aleatoria, pero es importante tener en cuenta que cualquier par de elementos (A i y A j ) que eliminamos y agregamos su suma ( A i + A j ) como nuevo elemento, estamos confirmados para obtener la suma de la array A como el último elemento restante debido a la propiedad de suma que se menciona a continuación:

S norte (suma) = (UN 1 + UN 2 ) + UN 3 + UN 4 + . . . + UN norte
S norte = (S 12 + UN 3 ) + UN 4 + . . . + Un
S norte = (S 123 + UN 4 )+ . . . + un n
         . . . . .
S n = S 123…n

Siga la siguiente ilustración para una mejor comprensión

Ilustración:

Considere un ejemplo A = [a1, a2, a3] y consultas = [[x1, 1, 2], [x2, 1, 3]]

1ra consulta: 

Al sumar x1 al primer y segundo elemento,  
la array A se convierte en [a1 + x1, a2 + x1, a3] .
nuevo a1 = a1 + x1
nuevo a2 = a2 + x1

2ª consulta: 

Al agregar x2 al primer, segundo y tercer elemento,  
la array A se convierte en [a1 + x2, a2 ​​+ x2, a3 + x2] .
nuevo a1 = a1 + x2
nuevo a2 = a2 + x2 
nuevo a3 = a3 + x2       

Operación 1: 

Seleccione a1 y a3, elimínelos y agregue su suma (a1 + a3) a la array,  
A se convierte en [a2, (a1 + a3)].
a2 anterior se convierte en a1 y la suma añadida se convierte en a2.

Operación 2: 

Seleccione a1 y a2, elimínelos y agregue su suma (a1 + a2) a la array,  
A se convierte en [a1 + a2 + a3]

Siga los pasos mencionados a continuación para implementar la idea:

  • Traverse para todas las consultas Q (digamos i) .
    • Pasar de consultas[i][1]-1 a consultas[i][2]-1 (digamos j) .
      • Agregue consultas [i] [0] a todos los elementos de la array en el rango.
  • Después de que terminen todos los bucles, recorra la array A[] para encontrar la suma y almacenarla en result .
  • Devuelve resultado como respuesta final.

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

C++14

// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the value of the reamining element
int randomize(vector<int>& A, int& N,
              vector<vector<int> >& queries, int& Q)
{
    int result = 0;
 
    // Loop to perform the queries
    for (int i = 0; i < Q; i++) {
        for (int j = queries[i][1] - 1;
             j < queries[i][2]; j++)
            A[j] += queries[i][0];
    }
 
    // Loop to find the sum of the array
    for (int i = 0; i < N; i++)
        result += A[i];
 
    return result;
}
 
// Driver code
int main()
{
    vector<int> A = { 1, 4, 3, 2, 4 };
    int N = A.size();
    vector<vector<int> > queries
        = { { 5, 1, 2 }, { -5, 1, 3 } };
    int Q = queries.size();
 
    // Function call
    cout << randomize(A, N, queries, Q);
    return 0;
}
Producción

9

Complejidad Temporal: O(Q*M + N) donde M es el rango máximo entre las consultas
Espacio Auxiliar:O(1)

Enfoque eficiente:  el problema también se puede resolver de manera eficiente al reducir el requisito de tiempo de las actualizaciones de consultas. La idea es la siguiente.

Si vemos con claridad, podemos encontrar nuestra respuesta haciendo las cosas al revés. 

  • Primero agregamos todos los elementos presentes en A en un elemento ans y luego,  
  • Agregue los elementos presentes en las consultas al rango que se proporciona, es decir, simplemente agregue las consultas [i]*((LR)+1) a ans en lugar de aplicarlo al rango dado [L, R] .

Siga los pasos que se indican a continuación:

  • Recorra A y agregue todos los elementos presentes en ella.
  • Recorra las consultas y agregue consultas[i][0] * ((consultas[i][1]-consultas[i][2])+1) a la suma.
  • Devuelve la suma como la respuesta requerida.

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

C++14

// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the remaining value
int solve(vector<int>& v,
          vector<vector<int> >& queries)
{
    int ans = 0;
 
    // Loop to calculate the array sum
    for (int i = 0; i < v.size(); i++) {
        ans += v[i];
    }
 
    // Loop to process the queries
    for (int i = 0; i < queries.size(); i++) {
        int temp = abs(queries[i][1] - queries[i][2]) + 1;
        ans += queries[i][0] * temp;
    }
    return ans;
}
 
// Driver code
int main()
{
    vector<int> A = { 1, 4, 3, 2, 4 };
    int N = A.size();
    vector<vector<int> > queries
        = { { 5, 1, 2 }, { -5, 1, 3 } };
 
    // Function call
    cout << solve(A, queries);
    return 0;
}

Java

// Java code to implement the approach
import java.io.*;
 
class GFG {
    // Function to find the remaining value
    public static int solve(int v[], int queries[][])
    {
        int ans = 0;
 
        // Loop to calculate the array sum
        for (int i = 0; i < v.length; i++) {
            ans += v[i];
        }
 
        // Loop to process the queries
        for (int i = 0; i < queries.length; i++) {
            int temp
                = Math.abs(queries[i][1] - queries[i][2])
                  + 1;
            ans += queries[i][0] * temp;
        }
        return ans;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int A[] = { 1, 4, 3, 2, 4 };
        int N = A.length;
        int queries[][] = { { 5, 1, 2 }, { -5, 1, 3 } };
 
        // Function call
        System.out.print(solve(A, queries));
    }
}
 
// This code is contributed by Rohit Pradhan
Producción

9

Complejidad del tiempo:O(N + Q)
Espacio Auxiliar:O(1)

Publicación traducida automáticamente

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