logo

Операция за добавяне на постоянен времеви диапазон върху масив

Даден е масив с размер N, който е инициализиран с всички нули. Дадени са ни много заявки за добавяне на диапазони, които трябва да бъдат приложени към този масив. Трябва да отпечатаме крайния актуализиран масив като наш резултат. 

Примери:  

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.

Този проблем може да бъде решен с помощта на сегментно дърво с мързеливи актуализации в O(log N) време на заявка, но можем да се справим по-добре тук, тъй като операцията за актуализиране не е дадена. Можем да обработваме всяка заявка за постоянно време, като използваме тази логика, когато заявка за добавяне на V е дадена в диапазон [a b], ние ще добавим V към arr[a] и –V към arr[b+1] сега, ако искаме да получим действителните стойности на масива, ще преобразуваме горния масив в масив с префиксна сума. 



Вижте примера по-долу, за да разберете:

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.

Така че в действителност, когато добавим стойност V към конкретен индекс на масива, това представлява добавяне на V към всички елементи вдясно към този индекс, поради което добавяме –V след диапазона, за да премахнем ефекта му след диапазона на заявката за добавяне. 
Моля, обърнете внимание в кода по-долу, ако диапазонът обхваща до последния индекс, добавянето на –V е пропуснато, за да бъде в ограничението на паметта на масива. 

Изпълнение:

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>

Изход
100 200 300 200 100 100 

Времева сложност: O(n) 
Помощно пространство: O(1)

 

Създаване на тест