题意:
思路:
如果不关注数据范围,不难看出是个简单DP,比较好写
但是N和Q都是1e5,怎么办呢
考虑根号分治
即对于每次询问,<=sqrt(N)和>sqrt(N)的部分分开考虑
如果K>sqrt(N),那么操作次数不会超过sqrt(N)
否则就暴力预处理DP数组,这样DP的空间和时间复杂度也不会爆
总复杂度为O((N+Q)sqrt(N)),不会超时
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=1e5+10;
const int mxv=321;
const int mxe=2e5+10;
const int Inf=1e18;
int N,Q,p,k;
int a[mxn];
int dp[mxn][mxv];
void solve(){
cin>>N;
for(int i=1;i<=N;i++) cin>>a[i];
int M=(int)sqrt(N);
for(int i=N;i>=1;i--){
for(int j=1;j<=M;j++){
if(i+a[i]+j>N) dp[i][j]=1;
else dp[i][j]=dp[i+a[i]+j][j]+1;
}
}
cin>>Q;
while(Q--){
cin>>p>>k;
if(k<=M){
cout<<dp[p][k]<<'\n';
}else{
int cnt=0;
while(p<=N){
p+=a[p]+k;
cnt++;
}
cout<<cnt<<'\n';
}
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}