codeforces 797E Array Queries

来源:互联网 发布:mac定制双用粉底液02 编辑:程序博客网 时间:2024/06/05 10:10

E. Array Queries
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

a is an array of n positive integers, all of which are not greater than n.

You have to process q queries to this array. Each query is represented by two numbers p and k. Several operations are performed in each query; each operation changes p to p + ap + k. There operations are applied until p becomes greater than n. The answer to the query is the number of performed operations.

Input

The first line contains one integer n (1 ≤ n ≤ 100000).

The second line contains n integers — elements of a (1 ≤ ai ≤ n for each i from 1 to n).

The third line containts one integer q (1 ≤ q ≤ 100000).

Then q lines follow. Each line contains the values of p and k for corresponding query (1 ≤ p, k ≤ n).

Output

Print q integers, ith integer must be equal to the answer to ith query.

Example
input
31 1 131 12 13 1
output
211
Note

Consider first example:

In first query after first operation p = 3, after second operation p = 5.

In next two queries p is greater than n after the first operation.



题目分析:

   直接按照题目描述去做肯定会超时,需要用到dp来优化速度;  

  d[p][k] 表示 p, k需要的次数 状态转移如下:

                              d[p][k] = d[p+a[p]+k][k] + 1; 

  所有的k值保存不下, 这里我保存k值小于200的dp值, d[p][k]  (k < 200), 当k大于200时直接模拟;


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = (int)1e5+5;int n, q, k, p;int d[maxn][205], a[maxn];int solve(int p, int k){    if(p > n) return 0;    else if(k < 200){        if(d[p][k] != -1) return d[p][k];        else {            d[p][k] = solve(p+a[p]+k, k)+1;            return d[p][k];        }    } else {        return solve(p+a[p]+k, k)+1;    }}int main(){    scanf("%d", &n);    for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);    scanf("%d", &q);    int ans = 0;    memset(d, -1, sizeof(d));    for(int i = 0; i < q; ++i){        scanf("%d%d", &p, &k);        ans = solve(p, k);        printf("%d\n", ans);    }}


0 0