Array Queries CodeForces - 797E

Posted

tags:

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

Array Queries CodeForces - 797E

WATLERE之路:

很显然的一道dp题,于是我妄想着通过时间O(n^2)的dp把它A掉,然后,我就走上了WATLERE之路.....

第一次,递归,RE

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int ans[100100];
 6 int a[100100];
 7 int n,k,q;
 8 int ans2[100100];//曾经忘记将排序后的查询按原序输出
 9 struct Q
10 {
11     int p,k,num;
12     bool operator<(const Q& b) const
13     {
14         return k<b.k||(k==b.k&&p<b.p);
15     }
16 }q2[100100];
17 int get(int x)
18 {
19     if(ans[x])    return ans[x];
20     if(x>n)
21         return ans[x]=0;
22     else
23         return ans[x]=get(x+a[x]+k)+1;
24 }
25 int main()
26 {
27     int i;
28     scanf("%d",&n);
29     for(i=1;i<=n;i++)
30         scanf("%d",&a[i]);
31     scanf("%d",&q);
32     for(i=1;i<=q;i++)
33     {
34         scanf("%d%d",&q2[i].p,&q2[i].k);
35         q2[i].num=i;
36     }
37     sort(q2+1,q2+q+1);
38     k=q2[1].k;
39     for(i=1;i<=q;i++)
40     {
41         if(q2[i].k!=k)
42         {
43             memset(ans,0,sizeof(ans));
44             k=q2[i].k;
45         }
46         ans2[q2[i].num]=get(q2[i].p);
47     }
48     for(i=1;i<=q;i++)
49         printf("%d\n",ans2[i]);
50     return 0;
51 }

第二次,非递归,RE

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int ans[100100],last[100100];
 6 int a[100100];
 7 int n,k,q;
 8 int ans2[100100];//曾经忘记将排序后的查询按原序输出
 9 struct Q
10 {
11     int p,k,num;
12     bool operator<(const Q& b) const
13     {
14         return k<b.k||(k==b.k&&p<b.p);
15     }
16 }q2[100100];
17 int get(int x)
18 {
19     int x1=x;
20     if(ans[x])    return ans[x];
21 //    if(x>n)
22 //        return ans[x]=0;
23 //    else
24 //        return ans[x]=get(x+a[x]+k)+1;
25     while(x<=n)
26     {
27         last[x+a[x]+k]=x;
28         x=x+a[x]+k;
29     }
30     while(x!=x1)
31     {
32         ans[last[x]]=ans[x]+1;
33         x=last[x];
34     }
35     return ans[x];//曾经忘记return
36 }
37 int main()
38 {
39     int i;
40     scanf("%d",&n);
41     for(i=1;i<=n;i++)
42         scanf("%d",&a[i]);
43     scanf("%d",&q);
44     for(i=1;i<=q;i++)
45     {
46         scanf("%d%d",&q2[i].p,&q2[i].k);
47         q2[i].num=i;
48     }
49     sort(q2+1,q2+q+1);
50     k=q2[1].k;
51     for(i=1;i<=q;i++)
52     {
53         if(q2[i].k!=k)
54         {
55             memset(ans,0,sizeof(ans));
56             memset(last,0,sizeof(last));
57             k=q2[i].k;
58         }
59         ans2[q2[i].num]=get(q2[i].p);
60     }
61     for(i=1;i<=q;i++)
62         printf("%d\n",ans2[i]);
63     return 0;
64 }

第三次,发现第一、第二次的做法会导致访问超过100000的数组,TLE

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int ans[500100];
 6 int a[100100];
 7 int n,k,q;
 8 int ans2[500100];//曾经忘记将排序后的查询按原序输出
 9 struct Q
10 {
11     int p,k,num;
12     bool operator<(const Q& b) const
13     {
14         return k<b.k||(k==b.k&&p<b.p);
15     }
16 }q2[100100];
17 int get(int x)
18 {
19     if(ans[x])    return ans[x];
20     if(x>n)
21         return ans[x]=0;
22     else
23         return ans[x]=get(x+a[x]+k)+1;
24 }
25 int main()
26 {
27     int i;
28     scanf("%d",&n);
29     for(i=1;i<=n;i++)
30         scanf("%d",&a[i]);
31     scanf("%d",&q);
32     for(i=1;i<=q;i++)
33     {
34         scanf("%d%d",&q2[i].p,&q2[i].k);
35         q2[i].num=i;
36     }
37     sort(q2+1,q2+q+1);
38     k=q2[1].k;
39     for(i=1;i<=q;i++)
40     {
41         if(q2[i].k!=k)
42         {
43             memset(ans,0,sizeof(ans));
44             k=q2[i].k;
45         }
46         ans2[q2[i].num]=get(q2[i].p);
47     }
48     for(i=1;i<=q;i++)
49         printf("%d\n",ans2[i]);
50     return 0;
51 }

 

以上是关于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