小美的数组询问(C++)

小美拿到了一个由正整数组成的数组,但其中有一些元素是未知的(用 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年春招

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值