这道题的思路还是很好想的,前一个的值,一定要<=当前值范围的最大值
非常有意思的一个点就是,在保证上面的条件成立后,这个pre该怎么给?
刚开始想以为是贪心,就-k,往少了给,但写着写着发现不对劲,这个+k>=pre,
而这个-k可没保证>=pre啊
其实,这个pre给值的范围是[a-k,a+k],二分给值就行
非常有纪念意义的一个点是,这次在过样例之后我开始去想这么写到底对不对,是不是有局限性,能够在做题的同时有认真思考,而不是追求做出,出现做不出就急躁的情况.
还有一个点,这题在发现No之后,不能直接输出No然后return,这是个多次测试的题,中途退出会导致数据输入有问题,设一个ok记录就行
多测题不能在输入完整前退出,要保证每次测试时输入的正确性
// Problem: k级序列
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/72389/C
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// Date: 2024-03-04 10:23:47
//
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
using namespace std;
int check(int l,int r,int pre) {//[L,r]第一个 >= pre的值int ans;while (l <= r) {int mid = l + r >> 1;if (mid < pre) l = mid + 1;else ans = mid, r = mid - 1;}return ans;
}
void solve() {int n, k; cin >> n >> k;bool ok = true;for (int i = 1,pre =INT_MIN,now,t; i <= n; ++i) {cin >> t;if (ok) {now = t + k;if (pre > now) {ok = false;}pre = t - k;}}if (ok)cout << "Yes\n";else cout << "No\n";
}
signed main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int t; cin >> t;while (t--) {solve();}return 0;
}