Water Problem

Posted

tags:

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

water problem

发布时间: 2015年10月10日 15:34   时间限制: 1000ms   内存限制: 256M

题意很简单 

给你N个数, Q个查询

每次查询给你一个区间[L, R]

你要找出 [L, R] 这个区间里面取模M后的最大值。

第一行一个T,表示测试数据组数。
第二行两个整数N, M (1<=N<=10^5, 1<=M<=10^9)。
第三行给你N个整数 整数范围在1到10^9之间。
第四行给你一个整数Q. ( 1<=Q<=10^5)
下面Q行, 每一行对应两个整数L, R (1<=L<=R<10^9)

每一行对应一个询问的答案。

复制
1
5 3
4 2 2 3 5
2
1 3 
4 5
2
2

 

这是一道线段树模板题。

注意到每组测试数据中的模数只有一个,所以可以每次先读入所有数字,并对M取模,之后再建立线段树回答区间最大值即可。

事实上,M的存在大概就是唬人的。

 

 1 #include <cstdio>
 2 
 3 inline int max(const int &a, const int &b) {
 4     return a > b ? a : b;
 5 }
 6 
 7 inline int min(const int &a, const int &b) {
 8     return a < b ? a : b;
 9 }
10 
11 inline int nextChar() {
12     static const int siz = 1 << 22;
13     static char buf[siz];
14     static char *head = buf + siz;
15     static char *tail = buf + siz;
16     
17     if (head == tail)
18         fread(head = buf, 1, siz, stdin);
19     
20     return int(*head++);
21 }
22 
23 inline int nextInt() {
24     register int ret = 0;
25     register int chr = nextChar();
26     
27     for (; chr < 48; chr = nextChar());
28     for (; chr > 47; chr = nextChar())
29         ret = ret * 10 + chr - 48;
30     
31     return ret;
32 }
33 
34 const int mxn = 100005;
35 const int mxm = 2000005;
36 
37 int n, m, p, seq[mxn], nod[mxm];
38 
39 void build(int t, int l, int r) {
40     if (l == r)
41         nod[t] = seq[l];
42     else {
43         int a = t << 1;
44         int b = t << 1 | 1;
45         int c = (l + r) >> 1;
46         
47         build(a, l, c);
48         build(b, c + 1, r);
49         
50         nod[t] = max(nod[a], nod[b]);
51     }
52 }
53 
54 int query(int t, int l, int r, int x, int y) {
55     if (l == x && y == r)
56         return nod[t];
57     else {
58         int a = t << 1;
59         int b = t << 1 | 1;
60         int c = (l + r) >> 1;
61         
62         if (y <= c)
63             return query(a, l, c, x, y);
64         else if (x > c)
65             return query(b, c + 1, r, x, y);
66         else
67             return max(
68                 query(a, l, c, x, c),
69                 query(b, c + 1, r, c + 1, y)
70             );
71     }
72 }
73 
74 signed main() {
75     for (register int cas = nextInt(); cas--; ) {
76         n = nextInt();
77         p = nextInt();
78         
79         for (register int i = 1; i <= n; ++i)
80             seq[i] = nextInt() % p;
81         
82         m = nextInt();
83         
84         build(1, 1, n);
85         
86         for (register int i = 1; i <= m; ++i) {
87             int l = nextInt();
88             int r = nextInt();
89             printf("%d\n", query(1, 1, n, l, r));
90         }
91     }
92 }

 

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

365. Water and Jug Problem

Water Problem(快速幂)

XidianOJ 1183 Water Problem: Items divided

LeetCode-Water and Jug Problem

365. Water and Jug Problem (GCD or BFS) TBC

leetcode365. Water and Jug Problem