题目要求修建栅栏,第一块栅栏和最后一块栅栏必须放在地面上,第 i 个栅栏所处的地面为 h[i] ,那么该栅栏可以放在 [a[i],a[i]+k-1] 的位置,要求每一块栅栏都必须与前一块栅栏相重合至少 1 个单位格子,问是否可以修建这样的栅栏
对于每一块栅栏我们可以维护改栅栏最低端所能处的位置,根据当前地形位置与前一个地形位置的关系,判断是否可以修建该栅栏
const int N=2e5+5;
int i,j,k;
int n,m;
int a[N];
int main()
{
//IOS;
rush(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
int l=a[1],r=a[1],flag=1;
for(int i=2;i<n && flag;i++){
if(a[i]>a[i-1]){
if(a[i]>=r+k) flag=0;
l=a[i];
r=min(r+k-1,a[i]+k-1);
}
else{
if(a[i]+k+k-1<=l) flag=0;
l=max(l-k+1,a[i]);
r=a[i]+k-1;
}
}
if(l>=a[n]+k || r+k<=a[n]) flag=0;
puts(flag?"YES":"NO");
}
// PAUSE;
return 0;
}