1. 程式人生 > 實用技巧 >Codeforces-1384B2 Koa and the Beach (Hard Version)

Codeforces-1384B2 Koa and the Beach (Hard Version)

B2.Koa and the Beach (Hard Version)

題目連結:https://vjudge.net/problem/CodeForces-1384B2

官方題解:https://codeforces.com/blog/entry/80562

解題思路:真的神仙Div2(太菜了QAQ),我們首先找到無論什麼時候都是安全的地方(滿足di+k<=l),同時,起始點和終點也都是安全的地方(i==0 || i==n+1),我們可以在安全點等任意長的時間。如果我們最終可以到達終點,則我們一定可以從一個安全點到另一個安全點。因此我們考慮的是兩個安全點之間的策略

我們每次從安全點出發,貪心選擇潮汐下降的時候,如果在潮汐上升的時候出發,一些不安全點可能就沒有辦法過去,我們肯定會在下次潮汐達到k的時候到達下一個安全點。具體解釋看程式碼

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
vector<int>q[10000+10];
inline ll read(){
    ll s=0,w=1;char ch = getchar();
    while(ch<48 || ch>57) {
        if(ch=='-') w=-1;ch = getchar();
    }
    while(ch>=48&&ch<=57) s = (s<<1
) + (s<<3) + (ch^48),ch=getchar(); return s*w; } int n,k,l; int main() { int t; t=read(); while(t--) { int n,k,l; cin>>n>>k>>l; vector<int>dep(n+1),q; q.push_back(0); for(int i=1;i<=n;i++) { cin
>>dep[i]; if(dep[i]+k<=l) q.push_back(i); //統計安全點 } bool ok=true; q.push_back(n+1); for(int i=1;i<q.size();i++) { int tide=k;bool down=true; //從潮汐下降的時候開始出發 for(int j=q[i-1]+1;j<q[i];j++)//在兩個安全點之間 { tide+=down?-1:1; //考慮tide要+1還是-1 if(down) tide-=max(0,dep[j]+tide-l); //如果我們需要到達下一個點,tide一定要小於等於某個值,作用就是求這個值 if(tide<0||dep[j]+tide>l) {ok=false;break;} //如果tide<0 即為dep>l或者dep+tide大於l,則沒有辦法求出最後的答案 if(tide==0) down=false; } if(!ok) break; } if(ok) cout<<"Yes\n"; else cout<<"No\n"; } }