小美的数组询问
小美拿到了一个由正整数组成的数组,但其中有一些元素是未知的(用 0 来表示)。
现在小美想知道,如果那些未知的元素在区间[l,r]范围内随机取值的话,数组所有元素之和的最小值和最大值分别是多少?
共有q次询问。
输入描述
第一行输入两个正整数n,q,代表数组大小和询问次数。
第二行输入n个整数ai,其中如果输入ai的为 0,那么说明ai是未知的。
接下来的q行,每行输入两个正整数l,r,代表一次询问。
1<=n,q<=10^5
0<=ai<=10^9
1<=l<=r<=10^9
输出描述
输出q行,每行输出两个正整数,代表所有元素之和的最小值和最大值。
示例 1
输入
3 2
1 0 3
1 2
4 4
输出
5 6
8 8
说明
只有第二个元素是未知的。
第一次询问,数组最小的和是 1+1=3=5,最大的和是 1+2+3=6。
第二次询问,显然数组的元素和必然为 8。
这个问题可以通过模拟来解决。我们可以遍历每个查询,对于每个查询,我们尝试将未知的元素在区间[l,r]内的所有可能取值计算出来,并计算数组的最小和和最大和。
具体步骤如下:
- 遍历每个查询,对于每个查询,遍历区间[l,r]内的所有位置,将未知的元素替换为区间内的每个可能的值。
- 计算替换后的数组的和,并更新最小和和最大和。
- 输出每次查询的最小和和最大和。
下面是相应的Python代码:
def calculate_sum(arr, l, r):
total = 0
for i in range(l, r+1):
total += arr[i]
return total
def min_max_sum(n, q, arr, queries):
min_sums = []
max_sums = []
for query in queries:
l, r = query
min_sum = float('inf')
max_sum = 0
# 遍历区间[l,r]内的所有位置
for i in range(l-1, r):
# 如果当前位置的元素是未知的,则尝试将其替换为区间[l,r]内的每个可能的值
if arr[i] == 0:
for j in range(l, r+1):
arr[i] = j
cur_sum = calculate_sum(arr, l-1, r-1)
min_sum = min(min_sum, cur_sum)
max_sum = max(max_sum, cur_sum)
arr[i] = 0 # 恢复为未知状态
else:
cur_sum = calculate_sum(arr, l-1, r-1)
min_sum = min(min_sum, cur_sum)
max_sum = max(max_sum, cur_sum)
min_sums.append(min_sum)
max_sums.append(max_sum)
return min_sums, max_sums
# 读取输入
n, q = map(int, input().split())
arr = list(map(int, input().split()))
queries = []
for _ in range(q):
l, r = map(int, input().split())
queries.append((l, r))
# 计算最小和和最大和
min_sums, max_sums = min_max_sum(n, q, arr, queries)
# 输出结果
for min_sum, max_sum in zip(min_sums, max_sums):
print(min_sum, max_sum)
将输入和输出与示例进行比较。
n,q = map(int, input().split())
A = [int(c) for c in input().split()]
zeros = A.count(0)
sum_ = sum(A)
for _ in range(q):
l,r = map(int, input().split())
print(sum_ + zeros*l, sum_ + zeros*r)