HDU 5443 The Water Problem (st表模版)

题目

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,...,ana1,a2,a3,...,anrepresenting the size of the water source. Given a set of queries each containing 22integers ll and rr, please find out the biggest water source between alal and arar. 

Input

First you are given an integer T(T10)T(T≤10) indicating the number of test cases. For each test case, there is a number n(0n1000)n(0≤n≤1000) on a line representing the number of water sources. nn integers follow, respectively a1,a2,a3,...,ana1,a2,a3,...,an, and each integer is in {1,...,106}{1,...,106}. On the next line, there is a number q(0q1000)q(0≤q≤1000) representing the number of queries. After that, there will be qq lines with two integers ll and r(1lrn)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

 

题解

 st表模版题

 

AC代码

#include <iostream>
#include <algorithm>
using namespace std;

int a[1010], LOG1, LOG2;
int Max[1010][15];

void st(int n){
    for(int j = 1; j <= LOG1; ++j)
        for(int i = 1; i + (1 << j) - 1 <= n; ++i)
            Max[i][j] = max(Max[i][j - 1], Max[i + (1 << (j - 1))][j - 1]);
}

int query(int l, int r, int LOG){
    int temp = max(Max[l][LOG], Max[r - (1 << LOG) + 1][LOG]);
    return temp;
}

int main(){
    int T; cin >> T;
    while(T--){
        int n; cin >> n;  //source数量
        for(int i = 1; i <= n; ++i)
            cin >> Max[i][0];
        for(LOG1 = 0; (1 << LOG1) <= n; ++LOG1){}
        LOG1--;
        st(n);
        int q; cin >> q;
        int l, r;
        while(q--){
            cin >> l >> r;
            for(LOG2 = 0; (1 << LOG2) <= (r - l); ++LOG2){}
            if(l == r) LOG2 = 0;
            else LOG2--;
            cout << query(l, r, LOG2) << endl;
        }
    }
    return 0;
}

 

posted @ 2019-08-01 11:35  Cl0ud_z  阅读(189)  评论(0编辑  收藏  举报