题目链接:Codeforces-797E-Array Queries
对于
k>n√
的询问,直接暴力来算,复杂度为
O(n√)
对于
k≤n√
的询问,
O(n1.5)
预处理出答案
dp[p][k]
。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
int dp[maxn][350];
int a[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int h=sqrt(n)+1;
for(int i=n;i>=1;i--)
for(int j=0;j<h;j++)
{
if(a[i]+i+j>n) dp[i][j]=1;
else dp[i][j]=dp[a[i]+i+j][j]+1;
}
int q;
scanf("%d",&q);
while(q--)
{
int p,k;
scanf("%d%d",&p,&k);
if(k<h) printf("%d\n",dp[p][k]);
else
{
int ans=0;
while(p<=n)
{
p+=a[p]+k;
ans++;
}
printf("%d\n",ans);
}
}
}