码迷,mamicode.com
首页 > 其他好文 > 详细

Array Queries CodeForces - 797E

时间:2017-09-12 18:36:39      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:get   通过   algorithm   color   忘记   .net   text   二次   ora   

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

标签:get   通过   algorithm   color   忘记   .net   text   二次   ora   

原文地址:http://www.cnblogs.com/hehe54321/p/cf-797e.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!