链接:小美的数组询问__牛客网
来源:牛客网
小美的数组询问
- 热度指数:631 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
- 算法知识视频讲解
小美拿到了一个由正整数组成的数组,但其中有一些元素是未知的(用 0 来表示)。
现在小美想知道,如果那些未知的元素在区间[l,r][l,r][l,r]范围内随机取值的话,数组所有元素之和的最小值和最大值分别是多少?
共有qqq次询问。
输入描述:
第一行输入两个正整数n,qn,qn,q,代表数组大小和询问次数。
第二行输入nnn个整数aia_iai,其中如果输入的aia_iai为 0,那么说明aia_iai是未知的。
接下来的qqq行,每行输入两个正整数 l,rl,rl,r,代表一次询问。
1≤n,q≤1051\leq n,q \leq 10^51≤n,q≤105
0≤ai≤1090 \leq a_i \leq 10^90≤ai≤109
1≤l≤r≤1091\leq l \leq r \leq 10^91≤l≤r≤109
输出描述:
输出qqq行,每行输出两个正整数,代表所有元素之和的最小值和最大值。
示例1:
输入
3 2
1 0 3
1 2
4 4
输出
5 6
8 8
说明
只有第二个元素是未知的。
第一次询问,数组最小的和是 1+1+3=5,最大的和是 1+2+3=6。
第二次询问,显然数组的元素和必然为 8。
思路:
这个题目很简单,初始代码是:
python
n, q = map(int, input().split())
numbers = list(map(int, input().split()))
cnt = numbers.count(0)
summation = sum(numbers)
for _ in range(q):
l, r = map(int, input().split())
print((summation + l * cnt), (summation + r * cnt)
看着逻辑没什么问题,但是就是死活ac不了,说编译错误,超时,自测用例也只能过8/10个
改进:
import sys
将 input() 操作换为 sys.stdin.readline() 就可以运行了。
python
import sys
# 读取所有输入
n, q = map(int, sys.stdin.readline().split())
numbers = list(map(int, sys.stdin.readline().split()))
# 统计0的个数和总和
cnt = numbers.count(0)
summation = sum(numbers)
# 处理查询并输出结果
for _ in range(q):
l, r = map(int, sys.stdin.readline().split())
# 直接输出结果
print(summation + l * cnt, summation + r * cnt)
思考:
1、说实话不太知道内部原理,问了chatgpt,解释区别如下:
input()
与 sys.stdin.readline()
的区别:
input()
在每次读取时会进行更多的处理,比如剥离尾部的换行符等,因此相对较慢。sys.stdin.readline()
是直接从标准输入读取一整行,速度更快,特别是在处理大数据时。
2、源自csdn博主:(原文链接:https://blog.csdn.net/m0_54689021/article/details/125583075 )
关于input( )和sys.stdin.readline( )的区别:
sys.stdin.readline( ) 会将标准输入全部获取,包括末尾的**'\n'** ,
input() 会把**'\n'**忽略
python
import sys
a=sys.stdin.readline()
b=input()
print(len(a),len(b))
执行效果:
abc
abc
4 3
如果在平时使用sys.stdin.readline( )获取输入的话 不要忘了去掉末尾的换行符
可以用 **sys.stdin.readline( ).strip('\n')**处理
python
import sys
a=sys.stdin.readline().strip('\n')
b=input()
print(len(a),len(b))
执行结果:
abc
abc
3 3
值得一提的是:
sys.stdin.readline的输入速度比 input要快很多 在输入量较大的时候(10^5)
速度 甚至会快上两倍 所以大家在打算法比赛 的时候尽量 都用sys.stdin.readline 来读入 呀**!**