一、题目
二、样例输入输出
(1)样例一
输入
3 10
50 -999999999 -50
输出
2 1
说明
第二天的气温未知,若这一天的气温在[41,50]或者[-50,-41],则共有1天寒潮;否则是两天寒潮。
(2)样例二
输入
4 100
-999999999 -999999999 -999999999 -999999999
输出
3 0
三、思路
我们要求最大的寒潮次数时,我们一定是希望两个数之间间隔比较小,但又是>=x的,这样可以让我们在-500000000——500000000之前得到更多个寒潮次数,并且当我们发现两数的间隔如果要达到>=x的时候,可能会出现右边的数<-500000000,已经超出边界了,这是我们就可以根据样例二得到,为了后面的数能构成寒潮的温差,我们就直接让那个数变成最大边界.
在求最小的寒潮次数的时候,我们一定是希望两个数的间隔比较大,但又是<x的,这样可以让我们在边界之间得到更少的寒潮次数,这里也会出现超出边界的情况,但是因为要得到最小的寒潮次数,那我们就直接让他等于-500000000,这样让后期的数都无法构成寒潮的温差.
四、代码
唯一还要注意的是:这里的数据范围比easy的大,所以要开long long
#include <iostream>
using namespace std;
const int N = 1e5+10;
long long a[N],b[N],num1,num2;
int main(void){
int n,x;
long long y=-999999999;
long long q1=-500000000,q2=500000000;
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
if(a[i]==y){
if(i==1){
a[i]=q2;
b[i]=q1;
}
else{
a[i]=a[i-1]-x>=q1?a[i-1]-x:q2;
b[i]=b[i-1]-x+1>=q1?b[i-1]-x+1:q1;
}
}
if(i>1&&a[i-1]-a[i]>=x){
num1++;
}
if(i>1&&b[i-1]-b[i]>=x){
num2++;
}
}
printf("%lld %lld\n",num1,num2);
return 0;
}