0
点赞
收藏
分享

微信扫一扫

D. Frog Traveler bfs优化

闲云困兽 2022-01-27 阅读 33

链接

/*new year!*/
#include <iostream>
#include <cstring>
#include <string>
#include<map>
#include<queue>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#define debug(a) cout<<#a<<"="<<a<<endl;
#define cd(a) scanf("%d", &a)
#define ll long long
#define PII pair<int, int>
#define _for(i, a, b) for (int i = a; i < b; i++)
#define For(i, a, b) for (int i = a; i <= b; i++)
#define foR(i, b, a) for (int i = b; i >= a; i--)
#define ms(a,b) memset(a, b, sizeof a)
#define gcd(a, b) __gcd(a, b)
#define lcm(a, b) a / gcd(a, b) * b
#define INF 0x3f3f3f3f
using namespace std;
const int N = 3e5+10,mod=998244353;

int n, a[N], b[N], d[N], fa[N], dis;// 存储下落前的

void pf(int x){
	if(x==n)
		return;
	pf(fa[x]);
	printf("%d ",x);
}

void sov(){
	cin >> n;
	For(i, 1, n) cin >> a[i];
	For(i, 1, n) cin >> b[i];
	dis = n;  // 距离0有ndis
	queue<int> q;
	q.push(n);
	while(!q.empty()){
		int x = q.front();
		q.pop();

		if(x<=0){
			printf("%d\n",d[x]);
			pf(x);
			return ;
		}
		int y = x + b[x];// 下落
		for (int i = min(y - 1, dis - 1); i >= y - a[y];i--){  // 更新 [y-1,y - a[y]] // 防止重复更新,优化,假如已经更新到dis,(dis < y),那我就从dis更新,因为单调性,
		// 我先更新的,步数小
		d[i] = d[x] + 1;
		fa[i] = x;
		q.push(i);
		}
		dis = min(dis, y - a[y]);
	}

	puts("-1");
}	

signed main(){
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif

	sov();

	return 0;
}
举报

相关推荐

0 条评论