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的主要内容,如果未能解决你的问题,请参考以下文章
XidianOJ 1183 Water Problem: Items divided
LeetCode-Water and Jug Problem