题意:给你n,k,l,表示koa距离目标的距离、涨潮的周期和koa的高度。koa一秒只能游泳一个距离。接着n个输入涨潮之前的海水高度。涨潮的规律是k秒上涨k秒下跌。当海水超过l时,koa就会被淹死。
传送门
题解:按照正常来走,首先判断当前位置是否最大差值能够直接走,如果可以,那么当前把潮变成落潮最大化-k(安全位置涨潮最大,然后最大慢慢落潮),如果不可以 那么就使上一个的潮增加1,这个过程需要更新就是max(上一次的潮+1,–(l-当前初始潮)),因为退潮的时候必须找到一个安全的最大退潮。
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define fio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define mse(a,b) memset(a,b,sizeof a)
#define pb push_back
#define pii pair<int,int>
using namespace std;
const int mod=1e9+7;
const int maxx=1e6+10;
const double eps=1e-6;
using namespace std;
const long double PI = 3.14159265358979323846;
//inline ll read(){ ll x=0,f=1; char ch=getchar(); while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar(); } while (isdigit(ch)) { x=x*10+ch-48; ch=getchar(); } return x*f;}
//ll cc = ((1ll << 62) - 1 + (1ll << 62));
/*struct node {
ll l,r ,lazy,val;
node() :l(),r(),lazy(),val(){}
node(ll a, ll b, ll c,ll d) :l(a),r(b),lazy(c),val(d){}
};
*/
ll a[maxx];
signed main(){
ll t; cin>>t;
while(t--){
ll n,k,l; cin>>n>>k>>l;
bool flag=false;
for(ll i=1;i<=n;i++) cin>>a[i];
ll water=-k,p;///water代表潮,+代表涨潮 -代表退潮
for(ll i=1;i<=n;i++){
p=l-a[i];/// 实际水位差
if(p<0) {flag=true; break;} //正常水位都会溺水,活不过去了,死定了
if(p>=k) water=-k; //潮涨满了都淹不死,就等到潮涨满落潮时走(-k状态
else water=max(water+1, -p); //一、最开始高过l,就等潮落到刚好淹不死的情况下到达该位置;二、可以直接走,水必须落潮1
if(water>p) {flag=true; break;} //每次水位变化后检查当前水位是否可以使之溺水
}
if(flag) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}