Hust oj 1189 区间最大值 II(线段树RMQ)

来源:互联网 发布:js中unicode编码 编辑:程序博客网 时间:2024/04/29 08:56
区间最大值 II
Time Limit: 1000 MS Memory Limit: 65535 K
Total Submit: 481(158 users) Total Accepted: 172(112 users) Rating: Special Judge: No

Description
给一个有n个整数的序列a1, a2, a3, ..., an,然后有q个提问,每个提问为两个整数i、j,(i<=j),请你回答,在ai到aj中,最大值是多少。

注意:1 <= n,q <= 100000, ai在int整型表示的范围内。

Input
有多组测试数据。
每组测试数据的第一行为一个整数n,表示有n个数;
第二行为n个整数,表示a1,a2,..an;
第三行为q,表示q个提问。
接下来有q行,每行两个数i, j, (i <= j)。
Output
每组测试数据先输出一行"Case n:", n从1开始计数;

接下来有q行,每行对应一个提问,每行只有一个整数,为ai到aj间的最大值。




Sample Input
3
1 3 2
2
1 2
2 3
4
1 2 3 4
3
1 2
2 4
1 1
Sample Output
Case 1:
3
3
Case 2:
2
4
1
Hint

题目数据已更新。


很直接的一个RMQ问题,手敲线段树直接AC,用cin和cout超时了一发,再用剁手QAQ

#include<cstdio>using namespace std;int const Maxsize = 200000;int val[Maxsize + 1];struct node{    int max;    int left;    int right;}tree[Maxsize*2];int Max(int x,int y){    return x>y?x:y;}int create(int root,int left,int right){    int a,b;    tree[root].left = left;    tree[root].right = right;    if(left == right)        return tree[root].max = val[left];    int middle = (right+left)/2;    a = create(2*root, left, middle);    b = create(2*root+1, middle+1, right);    return tree[root].max = Max(a,b);}int update(int root, int pos,int val){    int a,b;    if(pos < tree[root].left || tree[root].right < pos)        return tree[root].max;    if(tree[root].left == pos && tree[root].right == pos)        return tree[root].max = val;    a = update(2*root, pos, val);    b = update(2*root+1, pos, val);    return tree[root].max = Max(a,b);}int RMQ(int root, int left, int right){    if(tree[root].left>right || tree[root].right<left)        return 0;    if(left <=tree[root].left && tree[root].right <= right)\        return tree[root].max;    int a,b;    a = RMQ(2*root, left, right);    b = RMQ(2*root+1,left, right);    return Max(a,b);}int main(){    int n,m;    int right,left;    int cnt = 1;    while(~scanf("%d",&n))    {        for(int i=1; i<=n; i++)        {            scanf("%d",&val[i]);        }        create(1,1,n);        printf("Case %d:\n",cnt++);        scanf("%d",&m);        for(int i = 0; i < m;i++)        {           scanf("%d%d",&left,&right);           printf("%d\n",RMQ(1,left,right));        }    }}


0 0
原创粉丝点击