HDU5875

Posted Penn000

tags:

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

Function

Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 399    Accepted Submission(s): 151


Problem Description

The shorter, the simpler. With this problem, you should be convinced of this truth.
  
  You are given an array A of N postive integers, and M queries in the form (l,r). A function F(l,r) (1lrN) is defined as:
F(l,r)={AlF(l,r1) modArl=r;l<r.
You job is to calculate F(l,r), for each query (l,r).
 

 

Input

There are multiple test cases.
  
  The first line of input contains a integer T, indicating number of test cases, and T test cases follow. 
  
  For each test case, the first line contains an integer N(1N100000).
  The second line contains N space-separated positive integers: A1,,AN (0Ai109).
  The third line contains an integer M denoting the number of queries. 
  The following M lines each contain two integers l,r (1lrN), representing a query.
 

 

Output

For each query(l,r), output F(l,r) on one line.
 

 

Sample Input

1
3
2 3 3
1
1 3
 

 

Sample Output

2
 

Source

 
 1 //2016.9.11
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #define N 100005
 6 
 7 using namespace std;
 8 
 9 int a[N], nex[N];//nex数组,表示跳到下一个要取余的位置,比a[i]大的数不用取余,此处优化降低时间
10 
11 int main()
12 {
13     int T, n, q, ans;
14     scanf("%d", &T);
15     while(T--)
16     {
17         scanf("%d", &n);
18         for(int i = 1; i <= n; i++)
19         {
20             scanf("%d", &a[i]);
21         }
22         scanf("%d", &q);
23         int l, r;
24         for(int i = 1; i <= n; i++)
25         {
26             nex[i] = -1;
27             for(int j = i+1; j <= n; j++)
28                 if(a[i]>=a[j])
29                 {
30                     nex[i] = j;
31                     break;
32                 }
33         }
34         while(q--)
35         {
36             scanf("%d%d", &l, &r);
37             ans = a[l];
38             for(int i = nex[l]; i <= r; i = nex[i])
39             {
40                 if(i == -1)break;
41                 ans %= a[i];
42             }
43             printf("%d\n", ans);
44         }
45     }
46 
47     return 0;
48 }

 

以上是关于HDU5875的主要内容,如果未能解决你的问题,请参考以下文章

hdu 5875(单调栈)

HDU 5875Function

HDU5875Function(单调队列)

HDU 5875 Function st + 二分

Function---hdu5875(大连网选,区间连续求余)

hdu-5875