执行查询以将 K 添加到索引范围 [L, R] 后数组中存在的最大元素
给定一个由N个整数组成的数组arr[] (最初设置为 0 )和一个数组Q[] ,由{l, r, k}形式的查询组成,每个查询的任务是将K添加到索引l到r (包括两者)。执行所有查询后,返回数组中存在的最大元素。
例子:
Input: N=10, q[] = {{1, 5, 3}, {4, 8, 7}, {6, 9, 1}}
Output: 10
Explanation:
Initially the array is → [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Query1 {1, 5, 3} results in [3, 3, 3, 3, 3, 0, 0, 0, 0, 0]
Query2 {4, 8, 7} results in [3, 3, 3, 10, 10, 7, 7, 7, 0, 0]
Query2 {6, 9, 1} results in [3, 3, 3, 10, 10, 8, 8, 8, 1, 0]
Maximum value in the updated array = 10
方法:按照以下步骤解决问题。
- 遍历查询向量和每个查询{l, r, k}
- 将k添加到a[l]并从a[r+1]中减去 k
- 初始化变量x = 0来存储运行总和, m = INT_MIN来存储最大值
- 遍历数组,向x添加元素,并更新m。
- 打印最大值m
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the max sum
// after processing q queries
int max_sum(int a[],
vector, int> > v,
int q, int n)
{
// Store the cumulative sum
int x = 0;
// Store the maximum sum
int m = INT_MIN;
// Iterate over the range 0 to q
for (int i = 0; i < q; i++) {
// Variables to extract
// values from vector
int p, q, k;
p = v[i].first.first;
q = v[i].first.second;
k = v[i].second;
a[p] += k;
if (q + 1 <= n)
a[q + 1] -= k;
}
// Iterate over the range [1, n]
for (int i = 1; i <= n; i++)
{
// Calculate cumulative sum
x += a[i];
// Calculate maximum sum
m = max(m, x);
}
// Return the maximum sum after q queries
return m;
}
// Driver code
int main()
{
// Stores the size of array
// and number of queries
int n = 10, q = 3;
// Stores the sum
int a[n + 5] = { 0 };
// Storing input queries
vector, int> > v(q);
v[0].first.first = 1;
v[0].first.second = 5;
v[0].second = 3;
v[1].first.first = 4;
v[1].first.second = 8;
v[1].second = 7;
v[2].first.first = 6;
v[2].first.second = 9;
v[2].second = 1;
// Function call to find the maximum sum
cout << max_sum(a, v, q, n);
return 0;
}
Java
// Java program for the above approach
import java.lang.*;
import java.util.*;
class GFG{
// Function to find the max sum
// after processing q queries
static int max_sum(int a[],
ArrayList> v,
int q, int n)
{
// Store the cumulative sum
int x = 0;
// Store the maximum sum
int m = Integer.MIN_VALUE;
// Iterate over the range 0 to q
for(int i = 0; i < q; i++)
{
// Variables to extract
// values from vector
int p, qq, k;
p = v.get(i).get(0);
qq = v.get(i).get(1);
k = v.get(i).get(2);
a[p] += k;
if (qq + 1 <= n)
a[qq + 1] -= k;
}
// Iterate over the range [1, n]
for(int i = 1; i <= n; i++)
{
// Calculate cumulative sum
x += a[i];
// Calculate maximum sum
m = Math.max(m, x);
}
// Return the maximum sum after q queries
return m;
}
// Driver code
public static void main(String[] args)
{
// Stores the size of array
// and number of queries
int n = 10, q = 3;
// Stores the sum
int[] a = new int[n + 5];
// Storing input queries
ArrayList> v= new ArrayList<>();
for(int i = 0; i < q; i++)
v.add(new ArrayList<>());
v.get(0).add(1);
v.get(0).add(5);
v.get(0).add(3);
v.get(1).add(4);
v.get(1).add(8);
v.get(1).add(7);
v.get(2).add(6);
v.get(2).add(9);
v.get(2).add(1);
// Function call to find the maximum sum
System.out.println(max_sum(a, v, q, n));
}
}
// This code is contributed by offbeat
Python3
# Python program for the above approach
# Function to find the max sum
# after processing q queries
def max_sum(a, v, q, n):
# Store the cumulative sum
x = 0;
# Store the maximum sum
m = -10**9;
# Iterate over the range 0 to q
for i in range(q):
# Variables to extract
# values from vector
p = v[i][0][0];
q = v[i][0][1];
k = v[i][1];
a[p] += k;
if (q + 1 <= n):
a[q + 1] -= k;
# Iterate over the range [1, n]
for i in range(1, n + 1):
# Calculate cumulative sum
x += a[i];
# Calculate maximum sum
m = max(m, x);
# Return the maximum sum after q queries
return m;
# Driver code
# Stores the size of array
# and number of queries
n = 10
q = 3;
# Stores the sum
a = [0] * (n + 5);
# Storing input queries
v = [[[0 for i in range(2)] for x in range(2)] for z in range(q)]
v[0][0][0] = 1;
v[0][0][1] = 5;
v[0][1] = 3;
v[1][0][0] = 4;
v[1][0][1] = 8;
v[1][1] = 7;
v[2][0][0] = 6;
v[2][0][1] = 9;
v[2][1] = 1;
# Function call to find the maximum sum
print(max_sum(a, v, q, n));
# This code is contributed by _saurabh_jaiswal
Javascript
输出:
10
时间复杂度: O(N+K) 其中 N 是数组的大小,K 是查询的数量
空间复杂度: O(1)