Dada una array arr[] de tamaño N y una array Q que consta de consultas de los siguientes dos tipos:
- 1 LR : Imprime el número de elementos que se encuentran en el rango [L, R].
- 2 ix : Establecer arr[i] = x
Ejemplos:
Entrada: arr[] = {1, 2, 2, 3, 4, 4, 5, 6}, Q = {{1, {3, 5}}, {1, {2, 4}}, {1, {1, 2}}, {2, {1, 7}}, {1, {1, 2}}}
Salida: 4 5 3 2
Explicación:
los elementos de array del rango [3, 5] son {3, 4 , 4, 5}
Los elementos del arreglo del rango [2, 4] son {2, 2, 3, 4, 4}
Los elementos del arreglo del rango [1, 2] son {1, 2, 2}
Reemplazo de arr[1] by 7 modifica la array a {1, 7, 2, 3, 4, 4, 5, 6}
Los elementos que se encuentran en el rango [1, 2] son {1, 2}Entrada: arr = {5, 5, 1, 3, 4, 4, 2, 3}, Q = {{1, {3, 6}}, {1, {2, 4}}, {1, {10 , 20}}}
Salida: 6 5 0
Explicación:
Los elementos del arreglo del rango [3, 6] son {3, 3, 4, 4, 5, 5}
Los elementos del arreglo del rango [2, 4] son {2, 3, 3, 4, 4}
No existe ningún elemento del rango [10, 20] en la array.
Enfoque ingenuo:
el enfoque más simple para resolver este problema es el siguiente:
- Para la consulta de tipo (1 LR) , itere sobre toda la array y cuente la cantidad de elementos en la array de modo que L ≤ arr[i] ≤ R . Finalmente, imprima el conteo.
- Para la consulta de tipo (2 ix) , reemplace arr[i] por x .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ code for queries for number // of elements that lie in range // [l, r] (with updates) #include <bits/stdc++.h> using namespace std; // Function to set arr[index] = x void setElement(int* arr, int n, int index, int x) { arr[index] = x; } // Function to get count of elements // that lie in range [l, r] int getCount(int* arr, int n, int l, int r) { int count = 0; // Traverse array for (int i = 0; i < n; i++) { // If element lies in the // range [L, R] if (arr[i] >= l && arr[i] <= r) { // Increase count count++; } } return count; } // Function to solve each query void SolveQuery(int arr[], int n, vector<pair<int, pair<int, int> > > Q) { int x; for (int i = 0; i < Q.size(); i++) { if (Q[i].first == 1) { x = getCount(arr, n, Q[i].second.first, Q[i].second.second); cout << x << " "; } else { setElement(arr, n, Q[i].second.first, Q[i].second.second); } } } // Driver Code int main() { int arr[] = { 1, 2, 2, 3, 4, 4, 5, 6 }; int n = sizeof(arr) / sizeof(arr[0]); vector<pair<int, pair<int, int> > > Q = { { 1, { 3, 5 } }, { 1, { 2, 4 } }, { 1, { 1, 2 } }, { 2, { 1, 7 } }, { 1, { 1, 2 } } }; SolveQuery(arr, n, Q); return 0; }
Java
// Java code for queries for number // of elements that lie in range // [l, r] (with updates) import java.util.*; import java.lang.*; class GFG{ // Function to set arr[index] = x static void setElement(int[] arr, int n, int index, int x) { arr[index] = x; } // Function to get count of elements // that lie in range [l, r] static int getCount(int[] arr, int n, int l, int r) { int count = 0; // Traverse array for(int i = 0; i < n; i++) { // If element lies in the // range [L, R] if (arr[i] >= l && arr[i] <= r) { // Increase count count++; } } return count; } // Function to solve each query static void SolveQuery(int arr[], int n, ArrayList<List<Integer>> Q) { int x; for(int i = 0; i < Q.size(); i++) { if (Q.get(i).get(0) == 1) { x = getCount(arr, n, Q.get(i).get(1), Q.get(i).get(2)); System.out.print(x + " "); } else { setElement(arr, n, Q.get(i).get(1), Q.get(i).get(2)); } } } // Driver code public static void main (String[] args) { int arr[] = { 1, 2, 2, 3, 4, 4, 5, 6 }; int n = arr.length; ArrayList<List<Integer>> Q = new ArrayList<>(); Q.add(Arrays.asList(1, 3, 5)); Q.add(Arrays.asList(1, 2, 4)); Q.add(Arrays.asList(1, 1, 2)); Q.add(Arrays.asList(2, 1, 7)); Q.add(Arrays.asList(1, 1, 2)); SolveQuery(arr, n, Q); } } // This code is contributed by offbeat
Python3
# Python3 code for queries for number # of elements that lie in range # [l, r] (with updates) from typing import Generic, List, TypeVar T = TypeVar('T') V = TypeVar('V') class Pair(Generic[V, T]): def __init__(self, first: V, second: T) -> None: self.first = first self.second = second # Function to set arr[index] = x def setElement(arr: List[int], n: int, index: int, x: int) -> None: arr[index] = x # Function to get count of elements # that lie in range [l, r] def getCount(arr: List[int], n: int, l: int, r: int) -> int: count = 0 # Traverse array for i in range(n): # If element lies in the # range [L, R] if (arr[i] >= l and arr[i] <= r): # Increase count count += 1 return count # Function to solve each query def SolveQuery(arr: List[int], n: int, Q: List[Pair[int, Pair[int, int]]]): x = 0 for i in range(len(Q)): if (Q[i].first == 1): x = getCount(arr, n, Q[i].second.first, Q[i].second.second) print(x, end = " ") else: setElement(arr, n, Q[i].second.first, Q[i].second.second) # Driver Code if __name__ == "__main__": arr = [ 1, 2, 2, 3, 4, 4, 5, 6 ] n = len(arr) Q = [ Pair(1, Pair(3, 5)), Pair(1, Pair(2, 4)), Pair(1, Pair(1, 2)), Pair(2, Pair(1, 7)), Pair(1, Pair(1, 2)) ] SolveQuery(arr, n, Q) # This code is contributed by sanjeev2552
C#
// C# code for queries for number // of elements that lie in range // [l, r] (with updates) using System; using System.Collections.Generic; class GFG{ // Function to set arr[index] = x static void setElement(int[] arr, int n, int index, int x) { arr[index] = x; } // Function to get count of elements // that lie in range [l, r] static int getCount(int[] arr, int n, int l, int r) { int count = 0; // Traverse array for(int i = 0; i < n; i++) { // If element lies in the // range [L, R] if (arr[i] >= l && arr[i] <= r) // Increase count count += 1; } return count; } // Function to solve each query static void SolveQuery(int[] arr, int n, List<List<int>> Q) { int x; for(int i = 0; i < Q.Count; i++) { if (Q[i][0] == 1) { x = getCount(arr, n, Q[i][1], Q[i][2]); Console.Write(x + " "); } else { setElement(arr, n, Q[i][1], Q[i][2]); } } } // Driver code public static void Main(string[] args) { int[] arr = { 1, 2, 2, 3, 4, 4, 5, 6 }; int n = arr.Length; List<List<int>> myList = new List<List<int>>(); myList.Add(new List<int>{ 1, 3, 5 }); myList.Add(new List<int>{ 1, 2, 4 }); myList.Add(new List<int>{ 1, 1, 2 }); myList.Add(new List<int>{ 2, 1, 7 }); myList.Add(new List<int>{ 1, 1, 2 }); SolveQuery(arr, n, myList); } } // This code is contributed by grand_master
Javascript
<script> // Javascript code for queries for number // of elements that lie in range // [l, r] (with updates) // Function to set arr[index] = x function setElement(arr, n, index, x) { arr[index] = x; } // Function to get count of elements // that lie in range [l, r] function getCount(arr, n, l, r) { let count = 0; // Traverse array for (let i = 0; i < n; i++) { // If element lies in the // range [L, R] if (arr[i] >= l && arr[i] <= r) { // Increase count count++; } } return count; } // Function to solve each query function SolveQuery(arr, n, Q) { let x; for (let i = 0; i < Q.length; i++) { if (Q[i][0] == 1) { x = getCount(arr, n, Q[i][1][0], Q[i][1][1]); document.write(x + " "); } else { setElement(arr, n, Q[i][1][0], Q[i][1][1]); } } } // Driver Code let arr = [ 1, 2, 2, 3, 4, 4, 5, 6 ]; let n = arr.length; let Q = [[1, [3, 5]], [1, [2, 4]], [1, [1, 2]], [2, [1, 7]], [1, [1, 2]]]; SolveQuery(arr, n, Q); // This code is contributed by _saurabh_jaiswal. </script>
4 5 3 2
Complejidad temporal: O(Q * N)
Espacio auxiliar: O(1)
Enfoque eficiente:
el enfoque anterior se puede optimizar utilizando Fenwick Tree . Siga los pasos a continuación para resolver el problema:
- Construya un árbol de Fenwick a partir de la array dada.
- El árbol de Fenwick se representará como una array de tamaño igual al elemento máximo en la array , de modo que los elementos de la array se puedan usar como índice (la idea es similar a este enfoque).
- Recorra la array y aumente la frecuencia de cada elemento llamando al método de actualización del árbol de Fenwick.
- Para cada consulta de tipo (1 LR) , llame al método getSum del árbol de Fenwick. La respuesta para la consulta de tipo 1 será:
obtenerSuma(R) – obtenerSuma(L – 1)
- Para cada consulta de tipo (2 ix) , llame al método de actualización del árbol de Fenwick para aumentar la frecuencia del elemento agregado y disminuir el recuento del elemento que se reemplazará.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ code for queries for number // of elements that lie in range // [l, r] (with updates) #include <bits/stdc++.h> using namespace std; class FenwickTree { public: int* BIT; int N; FenwickTree(int N) { this->N = N; BIT = new int[N]; for (int i = 0; i < N; i++) { BIT[i] = 0; } } // Traverse all ancestors and // increase frequency of index void update(int index, int increment) { while (index < N) { // Increase count of the current // node of BIT Tree BIT[index] += increment; // Update index to that of parent // in update View index += (index & -index); } } // Function to return the // sum of arr[0..index] int getSum(int index) { int sum = 0; // Traverse ancestors of // BITree[index] while (index > 0) { // Add current element of // BITree to sum sum += BIT[index]; // Move index to parent node in // getSum View index -= (index & -index); } return sum; } }; // Function to set arr[index] = x void setElement(int* arr, int n, int index, int x, FenwickTree* fenTree) { int removedElement = arr[index]; fenTree->update(removedElement, -1); arr[index] = x; fenTree->update(x, 1); } // Function to get count of // elements that lie in // range [l, r] int getCount(int* arr, int n, int l, int r, FenwickTree* fenTree) { int count = fenTree->getSum(r) - fenTree->getSum(l - 1); return count; } // Function to solve each query void SolveQuery(int arr[], int n, vector<pair<int, pair<int, int> > > Q) { int N = 100001; FenwickTree* fenTree = new FenwickTree(N); for (int i = 0; i < n; i++) { fenTree->update(arr[i], 1); } int x; for (int i = 0; i < Q.size(); i++) { if (Q[i].first == 1) { x = getCount(arr, n, Q[i].second.first, Q[i].second.second, fenTree); cout << x << " "; } else { setElement(arr, n, Q[i].second.first, Q[i].second.second, fenTree); } } } // Driver Code int main() { int arr[] = { 1, 2, 2, 3, 4, 4, 5, 6 }; int n = sizeof(arr) / sizeof(arr[0]); vector<pair<int, pair<int, int> > > Q = { { 1, { 3, 5 } }, { 1, { 2, 4 } }, { 1, { 1, 2 } }, { 2, { 1, 7 } }, { 1, { 1, 2 } } }; SolveQuery(arr, n, Q); return 0; }
4 5 3 2
Complejidad de tiempo: O(n*log(N) + Q*log(N))
Espacio auxiliar: O(maxm), donde maxm es el elemento máximo presente en la array.
Publicación traducida automáticamente
Artículo escrito por mayankarora66 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA