Array Queries CodeForces - 797E

Posted qieqiemin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Array Queries CodeForces - 797E相关的知识,希望对你有一定的参考价值。

题目链接

非常好的一道题目,

分析,如果用暴力的话,时间复杂度是O(q*n)稳稳的超时

如果用二维DP的话,需要O (n*n)的空间复杂度,会爆空间。

那么分析一下,如果k>sqrt(n)的话,不需要sqrt(n) 次就可以达到大于n

而如果k<sqrt(n)的情况下,不妨用DP来处理,时间复杂度和空间复杂度皆为O ( n*sqrt( n ) )

那么都可以分类处理了。

详细见code

技术分享图片
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb std::ios::sync_with_stdio(false)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), ‘‘, sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define gg(x) getInt(&x)
using namespace std;
typedef long long ll;
inline void getInt(int* p);
const int maxn=1000010;
/*** TEMPLATE CODE * * STARTS HERE ***/
int n;
int a[maxn];
int p,q;
int k;
const int maxm=317  ;
int dp[100010][maxm];
void init(void)
{
    for(int j=1;j<maxm;j++)
    {
        for(int i=n;i>=1;i--)
        {
            if(i+j+a[i]>n)
                dp[i][j]=1;
            else
                dp[i][j]=1+dp[i+j+a[i]][j];
        }
    }
}

int solve(int p,int k)
{
    int cnt=0;
    while(p<=n)
    {
        p=a[p]+p+k;
        cnt++;
    }
    return cnt;
}
int main()
{
    gg(n);
    repd(i,1,n)
    {
        gg(a[i]);

    }
    init();
    gg(q);
    while(q--)
    {
        gg(p);
        gg(k);
        if(k>315)
            printf("%d
",solve(p,k));
        else
            printf("%d
",dp[p][k]);
    }
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch ==   || ch == 
);
    if (ch == -) {
        *p = -(getchar() - 0);
        while ((ch = getchar()) >= 0 && ch <= 9) {
            *p = *p * 10 - ch + 0;
        }
    }
    else {
        *p = ch - 0;
        while ((ch = getchar()) >= 0 && ch <= 9) {
            *p = *p * 10 + ch - 0;
        }
    }
}
View Code

 

以上是关于Array Queries CodeForces - 797E的主要内容,如果未能解决你的问题,请参考以下文章

Array Queries CodeForces - 797E

CodeForces 863D Yet Another Array Queries Problem 暴力

CodeForces 1114F--Please, another Queries on Array?(欧拉函数+线段树)

[codeforces]Round #538 (Div. 2) F. Please, another Queries on Array?

863D - Yet Another Array Queries Problem(思维)

CodeForces 932B Recursive Queries