码迷,mamicode.com
首页 > 其他好文 > 详细

I Hate It---hdu1754线段树

时间:2015-07-30 20:52:48      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1754

和上一题一样是模板题,就是那道题求得是和,这道求得是最大值:

技术分享
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<queue>

using namespace std;

#define N 201000
#define INF 0xfffffff
#define Lson r<<1
#define Rson r<<1|1

struct Segment
{
    int L, R, Max;
    int Mid()
    {
        return (L+R)>>1;
    }
} a[N<<2];

void BuildTree(int r, int L, int R)
{
    a[r].L = L;
    a[r].R = R;
    if(L == R)
    {
        scanf("%d", &a[r].Max);
        return ;
    }
    BuildTree(Lson, L, a[r].Mid());
    BuildTree(Rson, a[r].Mid()+1, R);

    a[r].Max = max(a[Lson].Max, a[Rson].Max);
}
int Query(int r, int L, int R)
{
    if(a[r].L == L && a[r].R == R)
        return a[r].Max;
    if(L > a[r].Mid())
        return Query(Rson, L, R);
    else if(R <= a[r].Mid())
        return Query(Lson, L, R);
    else
    {
        int Max1 = Query(Lson, L, a[r].Mid());
        int Max2 = Query(Rson, a[r].Mid()+1, R);
        return max(Max1 , Max2);
    }
}
void Update(int r, int p, int x)
{
    if(a[r].L == p && a[r].R == p)
    {
        a[r].Max = x;
        return ;
    }
    if(p > a[r].Mid())
        Update(Rson, p, x);
    else
        Update(Lson, p, x);

    a[r].Max = max(a[Rson].Max, a[Lson].Max);
}
int main()
{
    int n, m, a, b;
    char s[10];
    while(scanf("%d%d",&n, &m) != EOF)
    {
        BuildTree(1, 1, n);
        for(int i=0; i<m; i++)
        {
            scanf("%s%d%d", s, &a, &b);
            if(s[0] == Q)
                printf("%d\n", Query(1, a, b));
            else
                Update(1, a, b);
        }
    }
    return 0;
}
View Code

 

I Hate It---hdu1754线段树

标签:

原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4690375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!