River Jumping

題目鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章