題目鏈接:River Jumping
顯然我們可以發現如果連續的3個之中,最後一個減去第一個都小於s則無解,否則我們可以貪心能跳就跳,因爲連續兩個之中小於s是不影響的,因爲我們特判了連續3個的情況。
然後我們最後反向掃一遍第一次未跳的,如果都是滿足的則輸出。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,m,s,a[N],vis[N];
vector<int> res;
signed main(){
cin>>n>>m>>s;
for(int i=1;i<=m;i++) cin>>a[i]; a[m+1]=n;
if(a[m+1]<s) return puts("NO"),0;
if(!m) return puts("YES"),cout<<1<<' '<<0,0;
for(int i=2;i<=m+1;i++) if(a[i]-a[i-2]<s) return puts("NO"),0;
int pre=0;
for(int i=1;i<=m;i++) if(a[i]-pre>=s&&n-a[i]>=s) res.push_back(i),pre=a[i],vis[pre]=1;
res.push_back(m+1); pre=n;
for(int i=m;i>=0;i--) if(!vis[a[i]]){
if(pre-a[i]<s) return puts("NO"),0; pre=a[i]; res.push_back(i);
}
puts("YES");
for(int i:res) cout<<i<<' ';
return 0;
}