River Jumping

    技术2022-07-11  97

    题目链接: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; }
    Processed: 0.013, SQL: 9