题目链接:
分析:
icpccamp里的方法不会,我用了一个nex[]数组存储当前点ai需要取模的下一个点aj的编号j,如果aj>ai,就不用遍历。
时间为920ms
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 int t,n,q,l,r,a[100100],nex[100100]; 7 8 int main() 9 { 10 for(scanf("%d",&t);t--;) 11 { 12 scanf("%d",&n); 13 for(int i=1;i<=n;++i) scanf("%d",a+i); 14 for(int i=1;i<=n;++i) 15 { 16 nex[i]=-1; 17 for(int j=i+1;j<=n;++j) if(a[j]<=a[i]) { 18 nex[i]=j; 19 break; 20 } 21 } 22 scanf("%d",&q); 23 while(q--) 24 { 25 scanf("%d %d",&l,&r);int x=a[l]; 26 for(int j=nex[l];j<=r;j=nex[j]) 27 { 28 if(j==-1) break; 29 x%=a[j]; 30 } 31 printf("%d ",x); 32 } 33 } 34 }