l,r均为正数,那么要求最大或最小的话,最大肯定都是取r,最小肯定都是取l。所以只要统计有多少个0,再乘l和r,加上剩下的非0数字后,即可得到最大和最小值。 注意不要爆int。
AC
#include <iostream>
#include <cstdio>
using namespace std;
#define ll long long
const int maxn=1e5+10;
int n,q;
int a[maxn];
int main(){
scanf("%d %d",&n,&q);
ll cnt=0,sum=0;
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
if(a[i]==0){
cnt++;
}else{
sum+=a[i];
}
}
long long l,r;
while(q--){
scanf("%d %d",&l,&r);
printf("%lld %lld\n",sum+l*cnt,sum+r*cnt);
}
return 0;
}
import java.util.Scanner;
public class Main {
static final int maxn = 100010;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int q = scanner.nextInt();
int[] a = new int[maxn];
long cnt = 0;
long sum = 0;
for (int i = 1; i <= n; ++i) {
a[i] = scanner.nextInt();
if (a[i] == 0) {
cnt++;
} else {
sum += a[i];
}
}
while (q-- > 0) {
int l = scanner.nextInt();
int r = scanner.nextInt();
System.out.println((sum + l * cnt) + " " + (sum + r * cnt));
}
}
}
n , q = map(int , input().split())
arr = list(map(int , input().split()))
s = sum(arr)
zeroCnt = 0
for i in range(n):
if arr[i] == 0:
zeroCnt += 1
for _ in range(q):
l , r = map(int , input().split())
mn = s + l * zeroCnt
mx = s + r * zeroCnt
print(mn, mx)
小美拿到了一个由正整数组成的数组,但其中有一些元素是未知的(用0来表示)。现在小美想知道,如果那些未知的元素在区间[l,r]范围内随机取值的话,数组所有元素之和的最小值和最大值分别是多少?共有q次润问。
第一行整数n和q,表示数组的长度和询问的次数
第二行输入n个整数ai,其中如果输入的ai为0,那么说明ai是未知的 接下来的q行,每行输入两个正整数l,r,代表一次询问。
1≤n,q≤105
0≤ai≤109
l≤l≤r≤109
输出q行,每行输出两个正整数,代表所有元素之和的最小值和最大值.
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3 2
3 0 2
1 1
1 2
输出
6 6
6 7
说明
第二次询问中,最小为1+2+3=6,最大为2+2+3=7