Dada una array arr[] que consta de N enteros y una array Q[] de M pares que representan una consulta de tipo {X, Y} , la tarea es realizar consultas del siguiente tipo:
- Consulta (0, X): agregue el número entero X a todos los elementos de la array.
- Query(1, Y): multiplica cada elemento de la array por Y .
- Query(2, i): Imprime el valor en el índice i .
Ejemplos:
Entrada: arr[] = {5, 1, 2, 3, 9}, Q[][] = {{0, 5}, {2, 4}, {1, 4}, {0, 2}, { 2, 3}}
Salida: 14 34
Explicación:
A continuación se muestran los resultados después de realizar cada consulta:
- Consulta (0, 5): al agregar 5 a cada elemento de la array, se modifica la array como arr[] = {10, 6, 7, 8, 14}.
- Query(2, 4): imprime el elemento de la array en el índice 4, es decir, arr[4] = 14.
- Consulta (1, 4): al multiplicar todos los elementos de la array por 4, se modifica la array como arr[] = {40, 24, 28, 32, 56}
- Consulta (0, 2): agregando 2 a cada elemento de la array, modifica la array como arr [] = {42, 26, 30, 34, 58}
- Query(2, 3): Imprime el elemento en el índice 4, es decir, arr[3] = 34.
Entrada: arr[] = {3, 1, 23, 45, 100}, Q[][] = {{1, 2}, {0, 10}, {2, 3}, {1, 5}, { 2, 4}}
Salida: 100 1050
Enfoque ingenuo: el enfoque más simple para resolver el problema dado es realizar cada consulta recorriendo la array dada e imprimir el resultado correspondiente para cada consulta.
Complejidad de Tiempo: O(N * M)
Espacio Auxiliar: O(1)
Enfoque eficiente: el enfoque anterior se puede optimizar en función de las siguientes observaciones:
- Supongamos que A es un elemento y se realiza la siguiente operación:
- Sumando a1 a A , entonces el valor de A se convierte en A = A + a1 .
- Multiplique A por b1 , luego el valor de A se convierte en A = b1 * A + b1 * a1 .
- Agregue a2 a A , luego el valor de A se convierte en A = b1 * A + b1 * a1 + a2 .
- Multiplique A por b2 , luego el valor de A se convierte en A = b1 * b2 * A + b1 * b2 * a1 + a2 * b2
- Supongamos que Mul es la multiplicación de todos los enteros de la consulta de tipo 1 y Add almacena el valor de todas las consultas de tipo 0 , y el tipo 1 realizado en el orden dado a partir de 0 . Entonces se puede observar desde arriba que cualquier elemento de array arr[i] se modifica a (arr[i] * Mul + Add) .
Siga los pasos a continuación para resolver el problema:
- Inicializa dos variables, digamos Mul como 1 y Add como 0, almacena la multiplicación de todos los enteros en la consulta de tipo 2 y almacena el valor obtenido después de realizar la consulta de tipo 1 y 2 en el orden dado en un número 0 .
- Recorra la array dada de consultas Q[][2] y realice los siguientes pasos:
- Si Q[i][0] es 0 , incremente el valor de Agregar en Q[i][1] .
- De lo contrario, si el valor de Q[i][0] es 1 , multiplique Mul y Add por Q[i][1] .
- De lo contrario, imprima el valor (arr[Q[i][1]] * Mul + Add) como resultado de la consulta de tipo 2 .
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 modify the array // by performing given queries void Query(int arr[], int N, vector<vector<int> > Q) { // Stores the multiplication // of all integers of type 1 int mul = 1; // Stores the value obtained after // performing queries of type 1 & 2 int add = 0; // Iterate over the queries for (int i = 0; i < Q.size(); i++) { // Query of type 0 if (Q[i][0] == 0) { // Update the value of add add = add + Q[i][1]; } // Query of type 1 else if (Q[i][0] == 1) { // Update the value of mul mul = mul * Q[i][1]; // Update the value of add add = add * Q[i][1]; } // Otherwise else { // Store the element at index Q[i][1] int ans = arr[Q[i][1]] * mul + add; // Print the result for // the current query cout << ans << " "; } } } // Driver Code int main() { int arr[] = { 3, 1, 23, 45, 100 }; int N = sizeof(arr) / sizeof(arr[0]); vector<vector<int> > Q = { { 1, 2 }, { 0, 10 }, { 2, 3 }, { 1, 5 }, { 2, 4 } }; Query(arr, N, Q); return 0; }
Java
// Java program for the above approach import java.io.*; import java.lang.*; import java.util.*; public class GFG { // Function to modify the array // by performing given queries static void Query(int arr[], int N, int Q[][]) { // Stores the multiplication // of all integers of type 1 int mul = 1; // Stores the value obtained after // performing queries of type 1 & 2 int add = 0; // Iterate over the queries for (int i = 0; i < Q.length; i++) { // Query of type 0 if (Q[i][0] == 0) { // Update the value of add add = add + Q[i][1]; } // Query of type 1 else if (Q[i][0] == 1) { // Update the value of mul mul = mul * Q[i][1]; // Update the value of add add = add * Q[i][1]; } // Otherwise else { // Store the element at index Q[i][1] int ans = arr[Q[i][1]] * mul + add; // Print the result for // the current query System.out.print(ans + " "); } } } // Driver Code public static void main(String[] args) { int arr[] = { 3, 1, 23, 45, 100 }; int N = arr.length; int Q[][] = { { 1, 2 }, { 0, 10 }, { 2, 3 }, { 1, 5 }, { 2, 4 } }; Query(arr, N, Q); } } // This code is contributed by Kingash.
Python3
# Python3 program for the above approach # Function to modify the array # by performing given queries def Query(arr, N, Q): # Stores the multiplication # of all integers of type 1 mul = 1 # Stores the value obtained after # performing queries of type 1 & 2 add = 0 # Iterate over the queries for i in range(len(Q)): # Query of type 0 if (Q[i][0] == 0): # Update the value of add add = add + Q[i][1] # Query of type 1 elif (Q[i][0] == 1): # Update the value of mul mul = mul * Q[i][1] # Update the value of add add = add * Q[i][1] # Otherwise else: # Store the element at index Q[i][1] ans = arr[Q[i][1]] * mul + add # Print result for # the current query print(ans,end=" ") # Driver Code if __name__ == '__main__': arr = [3, 1, 23, 45, 100] N = len(arr) Q = [ [ 1, 2 ], [ 0, 10 ], [ 2, 3 ], [ 1, 5 ], [ 2, 4 ] ] Query(arr, N, Q) # This code is contributed by mohit kumar 29.
C#
// C# program for the above approach using System; class GFG { // Function to modify the array // by performing given queries static void Query(int[] arr, int N, int[, ] Q) { // Stores the multiplication // of all integers of type 1 int mul = 1; // Stores the value obtained after // performing queries of type 1 & 2 int add = 0; // Iterate over the queries for (int i = 0; i < Q.GetLength(0); i++) { // Query of type 0 if (Q[i, 0] == 0) { // Update the value of add add = add + Q[i, 1]; } // Query of type 1 else if (Q[i, 0] == 1) { // Update the value of mul mul = mul * Q[i, 1]; // Update the value of add add = add * Q[i, 1]; } // Otherwise else { // Store the element at index Q[i][1] int ans = arr[Q[i, 1]] * mul + add; // Print the result for // the current query Console.Write(ans + " "); } } } // Driver Code public static void Main() { int[] arr = { 3, 1, 23, 45, 100 }; int N = arr.Length; int[, ] Q = { { 1, 2 }, { 0, 10 }, { 2, 3 }, { 1, 5 }, { 2, 4 } }; Query(arr, N, Q); } } // This code is contributed by ukasp.
Javascript
<script> // Javascript implementation of the above approach // Function to modify the array // by performing given queries function Query(arr, N, Q) { // Stores the multiplication // of all integers of type 1 let mul = 1; // Stores the value obtained after // performing queries of type 1 & 2 let add = 0; // Iterate over the queries for (let i = 0; i < Q.length; i++) { // Query of type 0 if (Q[i][0] == 0) { // Update the value of add add = add + Q[i][1]; } // Query of type 1 else if (Q[i][0] == 1) { // Update the value of mul mul = mul * Q[i][1]; // Update the value of add add = add * Q[i][1]; } // Otherwise else { // Store the element at index Q[i][1] let ans = arr[Q[i][1]] * mul + add; // Print the result for // the current query document.write(ans + " "); } } } // Driver Code let arr = [ 3, 1, 23, 45, 100 ]; let N = arr.length; let Q = [[ 1, 2 ], [ 0, 10 ], [ 2, 3 ], [ 1, 5 ], [ 2, 4 ]]; Query(arr, N, Q); </script>
100 1050
Complejidad Temporal: O(M)
Espacio Auxiliar: O(1), ya que no se ha tomado ningún espacio extra.
Publicación traducida automáticamente
Artículo escrito por himanshu77 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA