思路:
分段处理;
当k小于根号n时记忆化搜索;
否则暴力;
来,上代码:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 100005 int n,q,ai[maxn],bi[maxn][320],size; inline void in(int &now) { char Cget=getchar();now=0; while(Cget>'9'||Cget<'0') Cget=getchar(); while(Cget>='0'&&Cget<='9') { now=now*10+Cget-'0'; Cget=getchar(); } } int dfs(int now,int k) { if(now>n) return 0; if(bi[now][k]) return bi[now][k]; else return bi[now][k]=dfs(now+ai[now]+k,k)+1; } int main() { in(n),size=sqrt(n); for(int i=1;i<=n;i++) in(ai[i]); in(q);int p,k; while(q--) { in(p),in(k); if(k>size) { int res=0; while(p<=n) { res++; p+=ai[p]+k; } printf("%d\n",res); } else printf("%d\n",dfs(p,k)); } return 0; }