小美拿到了一个由正整数组成的数组,但其中有一些元素是未知的(用 0 来表示)。
现在小美想知道,如果那些未知的元素在区间[l,r]范围内随机取值的话,数组所有元素之和的最小值和最大值分别是多少?
共有q次询问。
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
输入描述:
第一行输入两个正整数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。
可以看出,数组中为0的就是不确定的元素,他可以取l和r范围内的任意数,题目要求最小和最大,那就取l和r
因为未知的元素数量固定,所以我们可以记录它的数量,然后计算其他确定的元素的和,最后加上不确定的元素即可
注意:这道题ai量级是1e9,相加会变得很大,可以开一个longlong来保存他们的和
代码:
#include <iostream>
#include<algorithm>
#include<cstdio>
typedef long long LL;
using namespace std;
const int N=1e5+10;
int a[N];
int n,q;
int main()
{
scanf("%d%d",&n,&q);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int l,r;
LL sum=0;
// minsum,maxsum;
LL cnt=0;
for(int i=0;i<n;i++)
{
if(a[i]==0)
{
// minsum+=l;
// maxsum+=r;
cnt++;
}
// minsum+=a[i];
// maxsum+=a[i];
sum+=a[i];
}
while(q--)
{
// minsum=0;
// maxsum=0;
scanf("%d%d",&l,&r);
printf("%lld %lld\n",sum+l*cnt,sum+r*cnt);
}
return 0;
}
题目来自美团2024年春招