题解:因为我们最多把所有的点跳一遍么,所以直接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();
}