hdu 5443

来源:互联网 发布:dnf一进去网络连接中断 编辑:程序博客网 时间:2024/06/06 11:36

题目概述

给定由N个数构成的数列,进行Q次查询,回答区间[l,r]中最大的数

时限

1000ms/1500ms

输入

第一行整数times,其后times组数据,每组数据第一行整数N,下一行N个整数,下一行整数Q,其后Q行,每行两个整数l,r

限制

1<=times<=10;0<=N<=1000;0<=Q<=1000;

输出

每行一个数,为查询的回答

样例输入

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

样例输出

100
2
3
4
4
5
1
999999
999999
1

讨论

线段树,水题,没什么说的

题解状态

15MS,1764K,1159 B,C++

题解代码

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define INF 0x3f3f3f3f#define MAXN 10004#define memset0(a) memset(a,0,sizeof(a))int N, Q;int L[MAXN], R[MAXN], most[MAXN], nums[MAXN];void build(int i, int l, int r){    L[i] = l, R[i] = r;    if (l != r) {        build(i * 2, l, (l + r) / 2);        build(i * 2 + 1, (l + r) / 2 + 1, r);        most[i] = max(most[i * 2], most[i * 2 + 1]);    }    else        most[i] = nums[l];}int query(int i, int l, int r){    if (l == L[i] && r == R[i])        return most[i];    else if (r <= R[i * 2])        return query(i * 2, l, r);    else if (l >= L[i * 2 + 1])        return query(i * 2 + 1, l, r);    else        return max(query(i * 2, l, R[i * 2]), query(i * 2 + 1, L[i * 2 + 1], r));}void fun(){    for (int p = 1; p <= N; p++)        scanf("%d", &nums[p]);//input    build(1, 1, N);    scanf("%d", &Q);//input    for (int p = 0; p < Q; p++) {        int l, r;        scanf("%d%d", &l, &r);//input        printf("%d\n", query(1, l, r));//output    }}int main(void){    //freopen("nb_cin.txt", "r", stdin);    //freopen("nb_cout.txt","w",stdout);    int times;    scanf("%d", &times);//input    while (times--) {        scanf("%d", &N);//input        fun();    }}

EOF

0 0
原创粉丝点击