链接
/*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;
}