hdu 1754 I Hate It (线段树)

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

线段树的模板题,详细的都写在代码里了

//不知道为什么定义单个字符,用%c输入会超时,换成字符数组和%s就过了

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
using namespace std;
int tree[400005],num[200005];
void build(int i ,int j, int k)
{
    //建树,将1-n 2分分配给子节点,最后在给最终的节点赋值
    if(j==k)
    {
        tree[i]=num[j];
        return ;
    }
    int mid =(j+k)>>1;
    build(i<<1,j,mid);
    build(i<<1|1,mid+1,k);
    tree[i]=max(tree[i<<1],tree[i<<1|1]);
}
void add(int i,int x, int j ,int k,int p)
{
    //维护  从头寻找要改变的节点,找到后再依次返回父节点进行维护
    if (j==k)
    {
        tree[i]=p;
        return ;
    }
    int mid =(j+k)>>1;
    if(x<=mid)
        add(i<<1,x,j,mid,p);
    else
        add(i<<1|1,x,mid+1,k,p);
    tree[i]=max(tree[i<<1],tree[i<<1|1]);
}
int finds(int i,int x, int y, int j, int k)
{
    //查询  寻找符合要求的节点
    if(x<=j && y>=k)
        return tree[i];
    int mid=(j+k)>>1;
    if(y<=mid)
        return finds(i<<1,x,y,j,mid);
    else if(x>mid)
        return finds(i<<1|1,x,y,mid+1,k);
    else
        return max(finds(i<<1,x,y,j,mid),finds(i<<1|1,x,y,mid+1,k));
}
int main ()
{
    int n,m,i,t,j,k,x,y;
    char str[3]; //这里不用字符数组不知道为什么莫名其妙的超时
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for(i=1;i<=n;++i)
            scanf("%d",&num[i]);
        build(1,1,n);
        while(m--)
        {
            scanf("%s %d %d",str,&x,&y);
            if(str[0]=='Q'){
                    t=finds(1,x,y,1,n);
                printf("%d
",t);
            }
            else if (str[0]=='U')
                add(1,x,1,n,y);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/blowhail/p/11250668.html