logo

Operacija dodavanja konstantnog vremenskog raspona na nizu

Zadano je polje veličine N koje je inicijalizirano sa svim nulama. Dobili smo mnogo upita za dodavanje raspona koji bi se trebali primijeniti na ovaj niz. Moramo ispisati konačni ažurirani niz kao naš rezultat. 

Primjeri:  

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.

Ovaj problem se može riješiti pomoću stablo segmenta s lijenim ažuriranjem u O(log N) vremenu po upitu, ali ovdje možemo bolje jer operacija ažuriranja nije data. Možemo obraditi svaki upit u konstantnom vremenu koristeći ovu logiku kada je upit za dodavanje V dan u rasponu [a b], mi ćemo dodati V u arr[a] i –V u arr[b+1] sada ako želimo dobiti stvarne vrijednosti niza, pretvorit ćemo gornji niz u niz prefiksa sume. 



koliko tjedana u mjesecu

Pogledajte primjer u nastavku da biste razumjeli:

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.

Dakle, u stvari kada dodamo vrijednost V određenom indeksu niza, to predstavlja dodavanje V svim elementima neposredno do ovog indeksa i zato dodajemo –V nakon raspona kako bismo uklonili njegov učinak nakon raspona upita za dodavanje. 
Imajte na umu da u donjem kodu ako se raspon proteže do zadnjeg indeksa, dodatak –V je izostavljen kako bi bio u ograničenju memorije niza. 

Implementacija:

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>

Izlaz
100 200 300 200 100 100 

Vremenska složenost: O(n) 
Pomoćni prostor: O(1)

java vizualizator

 

Napravi kviz