B - I Hate It

  题目:

 

题目网址:Problem - 1754 (hdu.edu.cn)

  思路:

利用线段树存储区间内的最大值对应操作进行输出;

  代码实现:

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=200005;
int s[maxn],tree[maxn*4];
void bj(int rt)//对左右孩子进行最值判断
{
    tree[rt]=max(tree[rt*2],tree[rt*2+1]);
}
void build(int l,int r,int rt)//构造线段树
{
    if(l==r)//递归出口
    {
        tree[rt]=s[l];
        return ;
    }
    int mid=(l+r)/2;//区间中间值
    build(l,mid,rt*2);//对左右孩子进行递归
    build(mid+1,r,rt*2+1);
    bj(rt);
}
int query(int L,int R,int l,int r,int rt)//查询
{
    if(L<=l && R>=r)//递归出口区间在所给区间内
        return tree[rt];
    int mid=(l+r)/2;
    int ret=0;
    if(L<=mid)//判断递归左右孩子
        ret=max(ret,query(L,R,l,mid,rt*2));
    if(R>mid)
        ret=max(ret,query(L,R,mid+1,r,rt*2+1));
    return ret;
}
void update(int L,int s,int l,int r,int rt)//更新数据
{
    if(l==r)//递归出口
    {
        tree[rt]=s;
        return ;
    }
    int mid=(l+r)/2;
    if(L<=mid)//判断递归方向
        update(L,s,l,mid,rt*2);
    else
        update(L,s,mid+1,r,rt*2+1);
    bj(rt);
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1; i<=n; i++)
            scanf("%d",&s[i]);//数据都存入
        build(1,n,1);//线段树的构建
        int a,b;
        char ch;
        while(m--)
        {
            scanf(" %c%d%d",&ch,&a,&b);//操作输入
            if(ch=='Q')//对应操作进行处理
                printf("%d\n",query(a,b,1,n,1));
            else
                update(a,b,1,n,1);
        }
    }
    return 0;
}

 

posted @ 2021-08-04 15:09  wateriness  阅读(58)  评论(0)    收藏  举报