考试平台: 牛客网
题目类型: 30道单选题(60分)+ 2 道编程题 (15分 + 25分)
考试时间: 2024-03-09 (两小时)
题目描述
小美拿到了一个由正整数组成的数组,但其中有一些元素是未知的(用 0 来表示)。
现在小美想知道,如果那些未知的元素在区间 [l,r]
范围内随机取值的话,数组所有元素之和的最小值和最大值分别是多少?
共有q
次询问。
输入描述:
第一行输入两个正整数 n
,q
,代表数组大小和询问次数。
第二行输入n
个整数 a i a_i ai,其中如果输入的 a i a_i ai 为 0,那么说明 a i a_i ai 是未知的。
接下来的q
行,每行输入两个正整数 l
,r
,代表一次询问。
1 ≤ n , q ≤ 1 0 5 1\leq n,q \leq 10^5 1≤n,q≤105
0 ≤ a i ≤ 1 0 9 0 \leq a_i \leq 10^9 0≤ai≤109
1 ≤ l ≤ r ≤ 1 0 9 1\leq l \leq r \leq 10^9 1≤l≤r≤109
输出描述:
输出q
行,每行输出两个正整数,代表所有元素之和的最小值和最大值。
示例:
输入:
3 2
1 0 3
1 2
4 4输出:
5 6
8 8说明:
只有第二个元素是未知的。
第一次询问,数组最小的和是 1+1=3=5,最大的和是 1+2+3=6。
第二次询问,显然数组的元素和必然为 8。
题解
n, q = map(int, input().split())
a = list(map(int, input().split()))tot = sum(a)
# 0 的个数
zero_cnt = sum([1 for v in a if v == 0])for _ in range(q):l, r = map(int, input().split())# 最小和: 0 都选 l# 最大和: 0 都选 rmin_sum, max_sum = tot + zero_cnt * l, tot + zero_cnt * rprint(min_sum, max_sum)