zoukankan      html  css  js  c++  java
  • CF797E. Array Queries

    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
    3
    1 1 1
    3
    1 1
    2 1
    3 1
    output
    2
    1
    1

    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.

    题意:

    给你q次查询,每次会有两个数字p,k,问每次使p=p+a[p]+k,总共需要多少次会使p>n

    题解:

    存粹暴力必然超时,因此需要打个表,

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN=1e5+10;
    const int INF=-0x3f3f3f3f;
    int a[MAXN];
    int dp[MAXN][510];
    int main()
    {
    	int n;
    	scanf("%d",&n);
        for (int i = 1; i <=n ; ++i) {
            scanf("%d",&a[i]);
        }
        for(int i=n;i>=1;i--) {//表示为p,由大->小,我们需要变化的次数增加
            for (int j = 1; j <=500; ++j) {//表示为k的大小
                if(i+a[i]+j>n) dp[i][j]=1;
                else
                dp[i][j]=dp[i+a[i]+j][j]+1;
            }
        }
        int ans=0;
        int m;
        scanf("%d",&m);
        int p,k;
        while(m--)
        {
            ans=0;
            scanf("%d%d",&p,&k);
            if(k>400)
            {
                while(p<=n)
                {
                    p=p+a[p]+k;
                    ans++;
                }
                printf("%d
    ",ans);
            }
            else
                printf("%d
    ",dp[p][k]);
        }
    	return 0;
     }
    

      

  • 相关阅读:
    博客作业03--栈和队列
    博客作业02---线性表
    博客作业01-抽象数据类型
    C语言最后一次作业--总结报告
    C语言博客作业--函数嵌套调用
    java课程设计——2048
    博客作业06--图
    博客作业05--查找
    博客作业04--树
    博客作业03--栈和队列
  • 原文地址:https://www.cnblogs.com/-xiangyang/p/9441564.html
Copyright © 2011-2022 走看看