I Hate It HDU - 1754 (单点更新,区间最值)

多组输入。。。一开始眼瞎了没看见

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=524288;  //这应该是最小区间数
int sum[maxn];   //存最值
int node[maxn/2];
void pushup(int rt)  //求结点最值
{
    sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void bulid(int l,int r,int rt)  //建树
{
    if(l==r)
    {
        sum[rt]=node[l];
        return ;
    }
    int m=(l+r)>>1;
    bulid(l,m,rt<<1);
    bulid(m+1,r,rt<<1|1);
    //更新信息
    pushup(rt);    
}
// 改成绩 node[L]=c;
void update(int L,int c,int l,int r,int rt)
{
    if(l==r)  //到达叶节点,修改叶节点的值
    {
        sum[rt]=c;
        return ;
    }
    int m=(l+r)>>1;
    //根据条件判断往左子树调用还是往右
    if(L<=m)
        update(L,c,l,m,rt<<1);
    else
        update(L,c,m+1,r,rt<<1|1);
    pushup(rt);  //子节点的信息更新了,所以本节点也要更新信息
}
// 求  L~R 区间最值
int query(int L,int R,int l,int r,int rt)
{
    if(L<=l && r<=R)       //在区间内直接返回
        return sum[rt];
    int m=(l+r)>>1;
    //更新最值
    int ans=-1;
    if(L<=m)
        ans=max(ans,query(L,R,l,m,rt<<1));   //左子区间与[L,R]有重叠,递归
    if(R>m)
        ans=max(ans,query(L,R,m+1,r,rt<<1|1));  //右子区间与[L,R]有重叠,递归
    return ans;
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))   
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&node[i]);
        bulid(1,n,1);
        char ch;
        int x,y;
        for(int i=0;i<m;i++)
        {
            scanf(" %c%d%d",&ch,&x,&y);
            if(ch=='Q')
                printf("%d\n",query(x,y,1,n,1));
            else
                update(x,y,1,n,1);
        }
    }
    return 0;
}

简单的模板题

猜你喜欢

转载自blog.csdn.net/qq_41837216/article/details/83098315