C. Building a Fence
题意
给你n个基础高度和一个栅栏的长度k,如果建造这整个栅栏的过程可以满足所有规则,那么输出yes
规则是:
-
两个连续的相邻栅栏之间必须有长度为1的接触
-
第一个和最后一个栅栏必须和地接触
-
需要注意的是除了第一个和最后一个其他的栅栏也均不能超过地的高度大于(k-1)
思路
我们发现我们可以通过处理整个过程的最大高度和最小高度的所处区间来解决问题。
设(l)为当前的最小高度,(r)为当前的最大高度,当最小高度大于最大高度的时候输出no,然后我们在整个过程中的个更新方法是(l = max(l - k + 1, h[i]), r = min(r + k - 1 , h[i] + k - 1)),最后需要判断一下最后一个栅栏是否接地
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
#define int long long
int h[N], a[N], b[N];
void solve() {
int n, k; cin >> n >> k;
for (int i = 1; i <= n; ++i) cin >> h[i];
int l = 0, r = 0;
int flag = 1;
l = r = h[1];
for (int i = 2; i <= n; ++i) {
l = max(l - k + 1, h[i]);
r = min(r + k - 1, h[i] + k - 1);
if (l > r)flag = 0;
}
if (h[n] != l)flag = 0;
if (flag) cout << "YES
";
else cout << "NO
";
}
signed main() {
int T = 1;
cin >> T;
while (T--) {
solve();
}
}