logo

Operácia pridania konštantného časového rozsahu na poli

Dané pole veľkosti N, ktoré je inicializované všetkými nulami. Dostali sme mnoho rozsahov pridaných dopytov, ktoré by sa mali použiť na toto pole. Potrebujeme vytlačiť konečné aktualizované pole ako náš výsledok. 

Príklady:  

N = 6 Arr = [0 0 0 0 0 0] rangeUpdate1 [0 2] add 100 Arr = [100 100 100 0 0 0] rangeUpdate1 [1 5] add 100 Arr = [100 200 200 100 100 100] rangeUpdate1 [2 3] add 100 Arr = [100 200 300 200 100 100] Which is the final updated array.

Tento problém je možné vyriešiť pomocou segmentový strom s lenivými aktualizáciami v O (log N) čas na dotaz, ale tu môžeme urobiť lepšie, pretože operácia aktualizácie nie je daná. Pomocou tejto logiky môžeme spracovať každý dotaz v konštantnom čase, keď je dotaz na pridanie V daný v rozsahu [a b], pridáme V do arr[a] a –V do arr[b+1], ak chceme získať skutočné hodnoty poľa, skonvertujeme vyššie uvedené pole na pole súčtu prefixov. 



Pre pochopenie si pozrite príklad nižšie:

Arr = [0 0 0 0 0 0] rangeUpdate1 [0 2] add 100 Arr = [100 0 0 -100 0 0] rangeUpdate1 [1 5] add 100. Arr = [100 100 0 -100 0 0] Note: You can not add -100 at 6th index because array length is 6. rangeUpdate1 [2 3] add 100 Arr = [100 100 100 -100 -100 0] Now we will convert above operation array to prefix sum array as shown below Arr = [100 200 300 200 100 100] Which is the final updated array.

Takže v skutočnosti, keď pridáme hodnotu V do špecifického indexu poľa, predstavuje to pridanie V ku všetkým prvkom priamo k tomuto indexu, preto pridávame –V za rozsah, aby sme odstránili jeho účinok po jeho rozsahu pridania dotazu. 
Všimnite si prosím v nižšie uvedenom kóde, ak rozsah siaha až do posledného indexu, pridanie –V je vynechané, aby bolo v limite pamäte poľa. 

Implementácia:

C++
// C++ program to get updated array after many array range // add operation #include    using namespace std; // Utility method to add value val to range [lo hi] void add(int arr[] int N int lo int hi int val) {  arr[lo] += val;  if (hi != N - 1)  arr[hi + 1] -= val; } // Utility method to get actual array from operation array void updateArray(int arr[] int N) {  // convert array into prefix sum array  for (int i = 1; i < N; i++)  arr[i] += arr[i - 1]; } // method to print final updated array void printArr(int arr[] int N) {  updateArray(arr N);  for (int i = 0; i < N; i++)  cout << arr[i] << ' ';  cout << endl; } // Driver code int main() {  int N = 6;  int arr[N] = {0};  // Range add Queries  add(arr N 0 2 100);  add(arr N 1 5 100);  add(arr N 2 3 100);  printArr(arr N);  return 0; } 
Java
// Java program to get updated array after // many array range add operation import java.io.*; class GFG {  // Utility method to add value val  // to range [lo hi]  static void add(int arr[] int N int lo int hi  int val)  {  arr[lo] += val;  if (hi != N - 1)  arr[hi + 1] -= val;  }  // Utility method to get actual array from  // operation array  static void updateArray(int arr[] int N)  {  // convert array into prefix sum array  for (int i = 1; i < N; i++)  arr[i] += arr[i - 1];  }  // method to print final updated array  static void printArr(int arr[] int N)  {  updateArray(arr N);  for (int i = 0; i < N; i++)  System.out.print('' + arr[i] + ' ');  System.out.print('n');  }  // Driver code  public static void main(String[] args)  {  int N = 6;  int arr[] = new int[N];  // Range add Queries  add(arr N 0 2 100);  add(arr N 1 5 100);  add(arr N 2 3 100);  printArr(arr N);  } } // This code is contributed by Prakriti Gupta 
Python3
# Python3 program to get updated array # after many array range add operation # Utility method to add value # val to range [lo hi] def add(arr N lo hi val): arr[lo] += val if (hi != N - 1): arr[hi + 1] -= val # Utility method to get actual # array from operation array def updateArray(arr N): # convert array into prefix sum array for i in range(1 N): arr[i] += arr[i - 1] # method to print final updated array def printArr(arr N): updateArray(arr N) for i in range(N): print(arr[i] end=' ') print() # Driver code N = 6 arr = [0 for i in range(N)] # Range add Queries add(arr N 0 2 100) add(arr N 1 5 100) add(arr N 2 3 100) printArr(arr N) # This code is contributed by Anant Agarwal. 
C#
// C# program to get updated array after // many array range add operation using System; class GFG {  // Utility method to add value val  // to range [lo hi]  static void add(int[] arr int N int lo int hi  int val)  {  arr[lo] += val;  if (hi != N - 1)  arr[hi + 1] -= val;  }  // Utility method to get actual  // array from operation array  static void updateArray(int[] arr int N)  {  // convert array into  // prefix sum array  for (int i = 1; i < N; i++)  arr[i] += arr[i - 1];  }  // method to print final updated array  static void printArr(int[] arr int N)  {  updateArray(arr N);  for (int i = 0; i < N; i++)  Console.Write('' + arr[i] + ' ');  Console.Write('n');  }  // Driver code  public static void Main()  {  int N = 6;  int[] arr = new int[N];  // Range add Queries  add(arr N 0 2 100);  add(arr N 1 5 100);  add(arr N 2 3 100);  printArr(arr N);  } } // This code is contributed by Nitin Mittal. 
PHP
 // PHP program to get updated array after  // many array range add operation // Utility method to add value val  // to range [lo hi] function add(&$arr $N $lo $hi $val) { $arr[$lo] += $val; if ($hi != $N - 1) $arr[$hi + 1] -= $val; } // Utility method to get actual array // from operation array function updateArray(&$arr $N) { // convert array into prefix sum array for ($i = 1; $i < $N; $i++) $arr[$i] += $arr[$i - 1]; } // method to print final updated array function printArr(&$arr $N) { updateArray($arr $N); for ($i = 0; $i < $N; $i++) echo $arr[$i] . ' '; echo 'n'; } // Driver Code $N = 6; $arr = array_fill(0 $N NULL); // Range add Queries add($arr $N 0 2 100); add($arr $N 1 5 100); add($arr $N 2 3 100); printArr($arr $N); // This code is contributed by ita_c ?> 
JavaScript
<script> // Javascript program to get updated array after // many array range add operation    // Utility method to add value val  // to range [lo hi]  function add(arrNlohival)  {  arr[lo] += val;  if (hi != N - 1)  arr[hi + 1] -= val;  }    // Utility method to get actual array from  // operation array  function updateArray(arrN)  {  // convert array into prefix sum array  for (let i = 1; i < N; i++)  arr[i] += arr[i - 1];  }    // method to print final updated array  function printArr(arrN)  {  updateArray(arr N);  for (let i = 0; i < N; i++)  document.write('' + arr[i] + ' ');  document.write('  
'
); } // Driver code let N = 6; let arr=new Array(N); for(let i=0;i<N;i++) { arr[i]=0; } // Range add Queries add(arr N 0 2 100); add(arr N 1 5 100); add(arr N 2 3 100); printArr(arr N); // This code is contributed by rag2127 </script>

Výstup
100 200 300 200 100 100 

Časová zložitosť: O(n) 
Pomocný priestor: O(1)

 

Vytvoriť kvíz