Problem Description
In Land waterless, water is a very limited resource. People always fight for the biggest source of water. Given a sequence of water sources with a1,a2,a3,...,an representing the size of the water source. Given a set of queries each containing 2 integers l and r , please find out the biggest water source between al and ar .
Input
First you are given an integer T(T≤10) indicating the number of test cases. For each test case, there is a number n(0≤n≤1000) on a line representing the number of water sources. n integers follow, respectively a1,a2,a3,...,an , and each integer is in {1,...,10^6} . On the next line, there is a number q(0≤q≤1000) representing the number of queries. After that, there will be q lines with two integers l and r(1≤l≤r≤n) indicating the range of which you should find out the biggest water source.
Output
For each query, output an integer representing the size of the biggest water source.
Sample Input
3
1
100
1
1 1
5
1 2 3 4 5
5
1 2
1 3
2 4
3 4
3 5
3
1 999999 1
4
1 1
1 2
2 3
3 3
Sample Output
100
2
3
4
4
5
1
999999
999999
1
题目大意就是给定区间,求区间最值。
这里采用了RMQ的ST算法,直接套的模板。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int maxN = 1005; int n, q; int a[maxN]; int ma[maxN][20]; void RMQ() { memset(ma, 0, sizeof(ma)); for (int i = 0; i < n; ++i) ma[i][0] = a[i]; for (int j = 1; (1<<j) <= n; ++j) for (int i = 0; i+(1<<j)-1 < n; ++i) ma[i][j] = max(ma[i][j-1], ma[i+(1<<(j-1))][j-1]); } int query(int lt, int rt) { int k = 0; while ((1<<(k+1)) <= rt-lt+1) k++; return max(ma[lt][k], ma[rt-(1<<k)+1][k]); } void input() { scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &a[i]); RMQ(); } void work() { scanf("%d", &q); int u, v, ans; for (int i = 0; i < q; ++i) { scanf("%d%d", &u, &v); ans = query(u-1, v-1); printf("%d\n", ans); } } int main() { //freopen("test.in", "r", stdin); int T; scanf("%d", &T); for (int times = 0; times < T; ++times) { input(); work(); } return 0; }