Codeforces Round #751 (Div. 2) D. Frog Traveler(BFS)

题解:因为我们最多把所有的点跳一遍么,所以直接BFS模拟一下就行了。注意现在跳的点不能是以前已经跳过的点,并且只能越跳越高,否则没有意义,这样就保证了时间复杂度是线性的。
AC代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n;
int a[N],b[N];
int pre[N],d[N];
bool st[N];
void bfs(){
	for(int i=0;i<=n;i++)st[i]=false,pre[i]=d[i]=-1;
		
	queue<int>q;
	q.push(n);
	st[n]=1;
	int mi=n;
	
	while(q.size()){
		int now=q.front();
		q.pop();
		
		if(now-a[now]>=mi)continue;
		
		for(int i=now-a[now];i<mi;i++){
			int ne=i+b[i];
			if(st[ne])continue;
			
			st[ne]=true,pre[ne]=now,d[ne]=i;
			q.push(ne);
		}
		
		mi=now-a[now];
	}
}

void print_ans(){
	if(!st[0]){
		cout<<-1<<endl;
		return;
	}
	
	int x=0;
	vector<int>ans;
	while(pre[x]!=-1){
		ans.push_back(d[x]);
		x=pre[x];
	}
	
	reverse(ans.begin(),ans.end());
	cout<<ans.size()<<endl;
	for(auto x:ans)cout<<x<<" ";
	cout<<endl;
}

main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	
	bfs();
	print_ans();	
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值