CodeForcs 797E Array Queries

时间:2022-02-08 22:48:37

$dp$预处理,暴力。

如果$k > sqrt(n)$,那么答案不会超过$sqrt(n)$,暴力模拟即可。如果$k <= sqrt(n)$,那么可以$dp$预处理打表。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std; int dp[100010][320];
int n,q;
int a[100010]; int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]); int x = (int) sqrt(n);
for(int p=1;p<=x;p++)
{
for(int i=n;i>=1;i--)
{
if(i+a[i]+p>n) dp[i][p] = 1;
else dp[i][p] = dp[i+a[i]+p][p] + 1;
}
} scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int A,B;
scanf("%d%d",&A,&B);
if(B<=x)
{
printf("%d\n",dp[A][B]);
}
else
{
int ans=0;
while(A<=n)
{
ans++;
A=A+a[A]+B;
}
printf("%d\n",ans);
}
}
return 0;
}