题目链接: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;
}