1 条题解
-
0
直接根号分治一下。
如果 ,那么跳跃次数 ,直接暴力就好了。
否则,由于 比较小,直接预处理就好了。
代码
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; int n,a[N],f[N][400],Q; int work(int x,int k){return x>n?0:work(x+a[x]+k,k)+1;} int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); int S=sqrt(n); for(int i=n;i>=1;i--) for(int j=1;j<=S;j++){ if(i+a[i]+j>n)f[i][j]=1; else f[i][j]=f[i+a[i]+j][j]+1; } scanf("%d",&Q); while(Q--){ int x,k; scanf("%d%d",&x,&k); if(k>S)printf("%d\n",work(x,k)); else printf("%d\n",f[x][k]); } }
- 1
信息
- ID
- 81
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者