#include <bits/stdc++.h>
using namespace std;
const int N=105; // 数组最大长度(题目中n≤100,留冗余)
// 变量说明:
// a数组:用于计算“最大寒潮次数”的温度序列(对未知温度做最大化寒潮的赋值)
// b数组:用于计算“最小寒潮次数”的温度序列(对未知温度做最小化寒潮的赋值)
// dpa数组:dpa[i]表示前i天的最大寒潮次数累计
// dpi数组:dpi[i]表示前i天的最小寒潮次数累计
int a[N];
int b[N];
int dpa[N];
int dpi[N];
int main() {
// ========== 算法核心思想 ==========
// 问题目标:计算寒潮次数的最大值和最小值
// 核心策略:
// 1. 最大化寒潮次数:通过给未知温度(-999)赋值,让相邻天尽可能满足“降温≥x”
// - 未知温度优先设为“前一天温度 - x”(保证降温恰好为x,触发寒潮)
// - 若前一天温度-x低于-50,则设为50(保留后续降温空间)
// 2. 最小化寒潮次数:通过给未知温度赋值,让相邻天尽可能不满足“降温≥x”
// - 未知温度优先设为“前一天温度 - x + 1”(保证降温为x-1,不触发寒潮)
// - 若前一天温度-x+1低于-50,则设为-50(避免后续不必要的降温)
int n,x;
cin>>n>>x; // 输入天数n、寒潮判定阈值x
for(int i=1;i<=n;i++){
cin>>a[i]; // 读取原始温度序列到a数组
b[i] = a[i]; // 复制原始序列到b数组(a/b分别处理最大/最小情况)
}
// ========== 初始化第一天的温度(处理未知情况) ==========
if(a[1] == -999){ // 若第一天温度未知
a[1] = 50; // 最大化寒潮:设为50(后续更容易触发降温≥x)
b[1] = -50; // 最小化寒潮:设为-50(后续更难触发降温≥x)
}
// 初始化动态规划数组的起始值(第一天无前置天,寒潮次数为0)
dpa[1] = 0;
dpi[1] = 0;
// ========== 遍历第2~n天,分别计算最大/最小寒潮次数 ==========
for(int i=2;i<=n;i++){
// ---------------- 处理a数组:计算最大寒潮次数 ----------------
if(a[i] == -999){ // 当前天温度未知(需赋值以最大化寒潮)
// 若“前一天温度 - x”≥-50(合法区间下限)
if(a[i-1] - x >= -50){
a[i] = a[i-1] - x; // 设为前一天-x,保证降温恰好为x,触发寒潮
dpa[i] = dpa[i-1] + 1; // 寒潮次数+1
} else {
// 若前一天-x低于-50,设为50(重新获得后续降温空间)
a[i] = 50;
dpa[i] = dpa[i-1]; // 本次未触发寒潮,次数不变
}
}
// 当前天温度已知,判断是否触发寒潮
else if(a[i] <= a[i-1] - x){
dpa[i] = dpa[i-1] + 1; // 满足降温≥x,寒潮次数+1
}
else{
dpa[i] = dpa[i-1]; // 不满足,次数不变
}
// ---------------- 处理b数组:计算最小寒潮次数 ----------------
if(b[i] == -999){ // 当前天温度未知(需赋值以最小化寒潮)
// 若“前一天温度 - x”≥-50
if(b[i-1] - x >= -50){
// 设为前一天-x+1,保证降温为x-1(不足x,不触发寒潮)
b[i] = b[i-1] - x + 1;
dpi[i] = dpi[i-1]; // 未触发,次数不变
} else {
// 若前一天-x低于-50,设为-50(避免后续降温)
b[i] = -50;
dpi[i] = dpi[i-1]; // 未触发,次数不变
}
}
// 当前天温度已知,判断是否触发寒潮(仅无法避免时计数)
else if(b[i] <= b[i-1] - x){
dpi[i] = dpi[i-1] + 1; // 强制满足条件,次数+1
}
else{
dpi[i] = dpi[i-1]; // 不满足,次数不变
}
}
// 输出最大寒潮次数和最小寒潮次数
cout << dpa[n] << " " << dpi[n];
return 0;
}