1. 程式人生 > >Array Queries CodeForces - 797E

Array Queries CodeForces - 797E

get () ora lan sizeof div ces || code

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