Dada una array arr[] que consta de N enteros y una array Q[][] que consta de consultas de la forma (L, R, K) , la tarea de cada consulta es calcular la suma de los elementos de la array del rango [ L, R] que están presentes en los índices ( indexación basada en 0 ) que son múltiplos de K y
Ejemplos:
Entrada: arr[]={1, 2, 3, 4, 5, 6}, Q[][]={{2, 5, 2}, {0, 5, 1}} Salida:
8
21
Explicación
:
Consulta1 : Los índices (2, 4) son múltiplos de K(= 2) del rango [2, 5]. Por lo tanto, Suma requerida = 3+5 = 8.
Consulta 2: Dado que todos los índices son múltiplos de K(= 1), por lo tanto, la suma requerida del rango [0, 5] = 1 + 2 + 3 + 4 + 5 + 6 = 21Entrada: arr[]={4, 3, 5, 1, 9}, Q[][]={{1, 4, 1}, {3, 4, 3}} Salida
:
18
1
Enfoque: el problema se puede resolver utilizando la técnica de consulta Prefix Sum Array y Range sum . Siga los pasos a continuación para resolver el problema:
- Inicialice una array de tamaño prefixSum[][] tal que prefixSum[i][j] almacene la suma de los elementos presentes en los índices que son un múltiplo de i hasta el j -ésimo índice.
- Recorra la array y calcule previamente las sumas de los prefijos.
- Recorra cada consulta, imprima el resultado de prefixSum[K][R] – prefixSum[K][L – 1] .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ Program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Structure of a Query struct Node { int L; int R; int K; }; // Function to calculate the sum of array // elements at indices from range [L, R] // which are multiples of K for each query int kMultipleSum(int arr[], Node Query[], int N, int Q) { // Stores Prefix Sum int prefixSum[N + 1][N]; // prefixSum[i][j] : Stores the sum from // indices [0, j] which are multiples of i for (int i = 1; i <= N; i++) { prefixSum[i][0] = arr[0]; for (int j = 0; j < N; j++) { // If index j is a multiple of i if (j % i == 0) { // Compute prefix sum prefixSum[i][j] = arr[j] + prefixSum[i][j - 1]; } // Otherwise else { prefixSum[i][j] = prefixSum[i][j - 1]; } } } // Traverse each query for (int i = 0; i < Q; i++) { // Sum of all indices upto R which // are a multiple of K int last = prefixSum[Query[i].K][Query[i].R]; int first; // Sum of all indices upto L - 1 which // are a multiple of K if (Query[i].L == 0) { first = prefixSum[Query[i].K][Query[i].L]; } else { first = prefixSum[Query[i].K][Query[i].L - 1]; } // Calculate the difference cout << last - first << endl; } } // Driver Code int main() { int arr[] = { 1, 2, 3, 4, 5, 6 }; int N = sizeof(arr) / sizeof(arr[0]); int Q = 2; Node Query[Q]; Query[0].L = 2, Query[0].R = 5, Query[0].K = 2; Query[1].L = 3, Query[1].R = 5, Query[1].K = 5; kMultipleSum(arr, Query, N, Q); }
Java
// Java program to implement // the above approach import java.util.*; class GFG{ // Structure of a Query static class Node { int L; int R; int K; }; // Function to calculate the sum of array // elements at indices from range [L, R] // which are multiples of K for each query static void kMultipleSum(int arr[], Node Query[], int N, int Q) { // Stores Prefix Sum int prefixSum[][] = new int[N + 1][N]; // prefixSum[i][j] : Stores the sum from // indices [0, j] which are multiples of i for(int i = 1; i <= N; i++) { prefixSum[i][0] = arr[0]; for(int j = 0; j < N; j++) { // If index j is a multiple of i if (j % i == 0) { // Compute prefix sum if (j != 0) prefixSum[i][j] = arr[j] + prefixSum[i][j - 1]; } // Otherwise else { prefixSum[i][j] = prefixSum[i][j - 1]; } } } // Traverse each query for(int i = 0; i < Q; i++) { // Sum of all indices upto R which // are a multiple of K int last = prefixSum[Query[i].K][Query[i].R]; int first; // Sum of all indices upto L - 1 which // are a multiple of K if (Query[i].L == 0) { first = prefixSum[Query[i].K][Query[i].L]; } else { first = prefixSum[Query[i].K][Query[i].L - 1]; } // Calculate the difference System.out.print(last - first + "\n"); } } // Driver Code public static void main(String[] args) { int arr[] = { 1, 2, 3, 4, 5, 6 }; int N = arr.length; int Q = 2; Node Query[] = new Node[Q]; for(int i = 0; i < Q; i++) Query[i] = new Node(); Query[0].L = 2; Query[0].R = 5; Query[0].K = 2; Query[1].L = 3; Query[1].R = 5; Query[1].K = 5; kMultipleSum(arr, Query, N, Q); } } // This code is contributed by 29AjayKumar
C#
// C# program to implement // the above approach using System; class GFG{ // Structure of a Query class Node { public int L; public int R; public int K; }; // Function to calculate the sum of array // elements at indices from range [L, R] // which are multiples of K for each query static void kMultipleSum(int []arr, Node []Query, int N, int Q) { // Stores Prefix Sum int [,]prefixSum = new int[N + 1, N]; // prefixSum[i,j] : Stores the sum from // indices [0, j] which are multiples of i for(int i = 1; i <= N; i++) { prefixSum[i, 0] = arr[0]; for(int j = 0; j < N; j++) { // If index j is a multiple of i if (j % i == 0) { // Compute prefix sum if (j != 0) prefixSum[i, j] = arr[j] + prefixSum[i, j - 1]; } // Otherwise else { prefixSum[i, j] = prefixSum[i, j - 1]; } } } // Traverse each query for(int i = 0; i < Q; i++) { // Sum of all indices upto R which // are a multiple of K int last = prefixSum[Query[i].K,Query[i].R]; int first; // Sum of all indices upto L - 1 which // are a multiple of K if (Query[i].L == 0) { first = prefixSum[Query[i].K,Query[i].L]; } else { first = prefixSum[Query[i].K,Query[i].L - 1]; } // Calculate the difference Console.Write(last - first + "\n"); } } // Driver Code public static void Main(String[] args) { int []arr = { 1, 2, 3, 4, 5, 6 }; int N = arr.Length; int Q = 2; Node []Query = new Node[Q]; for(int i = 0; i < Q; i++) Query[i] = new Node(); Query[0].L = 2; Query[0].R = 5; Query[0].K = 2; Query[1].L = 3; Query[1].R = 5; Query[1].K = 5; kMultipleSum(arr, Query, N, Q); } } // This code is contributed by 29AjayKumar
8 6
Complejidad de tiempo: O(N 2 + O(Q)), calcular la array de suma de prefijos requiere una complejidad computacional O(N 2 ) y cada consulta requiere una complejidad computacional O(1).
Espacio Auxiliar: O(N 2 )
Publicación traducida automáticamente
Artículo escrito por Ripunjoy Medhi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA