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?