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) (1≤l≤r≤N) is defined as:
F(l,r)={AlF(l,r−1) 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(1≤N≤100000).
  The second line contains N space-separated positive integers: A1,…,AN (0≤Ai≤109).
  The third line contains an integer M denoting the number of queries. 
  The following M lines each contain two integers l,r (1≤l≤r≤N), 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

2016 ACM/ICPC Asia Regional Dalian Online

 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 }
时间: 2024-11-15 09:27:19

HDU5875的相关文章

HDU5875 - Function

HDU5875 - Function 做法:st表+二分的经典题.不能使用数学函数log,否则会tle,需要预处理 #include <bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;++i) #define per(i,a,b) for(int i=a;i>=b;--i) #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_back #define MP make_pa

2016大连网络赛 1008 &amp; hdu5875 (优先队列+离线)=不确定暴力

题意:给你一个区间,求a_l%a_(l+1)%a_(l+2)%-%a_r 的值 分析:听说一个数在给定区间中只有不是很多的位置可一连续对它求模,所以想到一个比较暴力有可行的方法,猜想复杂度应该是nlogn.具体是这样的,从左到有枚举每个位置, L[]记录[1,r]中所有元素连续取模到r的值.一开始把a[1]加进优先队列pq,对于第二位置,若pq.top()>=a[i],取出并取模,然后更新对应的位置l的答案,并把取模后答案插入优先队列,然后处理有区间是2的所有询问.对于第i个位置,若pq.top

hdu-5875

题目大意: f(l,r)=a[l]   l==r f(l,r)=f(l,r-1)%a[r]  l<r 思路: 由此可以推出f(l,r)=a[l]%a[l+1]%a[l+2]%....%a[r] 根据取余的性质,只要后面取余的数不小于前面的数值不会改变,因此我们只要记录比a[l]小的第一个数,假如为a[x]然后接着找比a[x]小的第一个数 记为a[y] 如此一直找下去直到a[r] 代码如下: #include<iostream> #include<cstdio> #includ

2016大连网赛

网赛的时候就是前三个小时过了后面五道,然后两个小时就没搞出啥了;账号密码都忘了,只好重新写一遍了; hdu-5868 hdu-5869 hdu-5870 hdu-5871 hdu-5872 hdu-5873 hdu-5874 hdu-5875 hdu-5876 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath>