1 条题解

  • 0
    @ 2022-2-28 13:50:12

    直接根号分治一下。

    如果 k>nk>\sqrt{n},那么跳跃次数 <n<\sqrt{n},直接暴力就好了。

    否则,由于 kk 比较小,直接预处理就好了。


    代码
    #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
    上传者