hdu 1754 基础线段树

本文详细介绍了一种简单实用的数据结构——线段树,并通过一个具体题目实例展示了如何利用线段树实现区间查询最值及单点更新的操作。文章不仅提供了清晰的思路解析,还附带了完整的代码实现。

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

思路 : 比较简单的线段树,区间求最值,单点更新。
读入字符的时候,最好用字符数组保存,使用 %s读入,如果使用 %c 会T ..好像是会吃掉换行符。。

#include<cstdio>
#include<iostream>
#include<algorithm>
#define maxn 2000005
using namespace std;
int stu[maxn],n,m,a,b;
void create(int l,int r,int sum)
{
    if(l==r) {scanf("%d",&stu[sum]);return ;}
    int m=(l+r)>>1;
    create(l,m,sum<<1);
    create(m+1,r,sum<<1|1);
    stu[sum]=max(stu[sum<<1],stu[sum<<1|1]);
}
int quary(int l,int r,int L,int R,int sum)
{
    if(L>=l&&R<=r) return stu[sum];
    int l1=0,r1=0;
    int m=(L+R)>>1;
    if(l<=m) l1=quary(l,r,L,m,sum<<1);
    if(r>m) r1=quary(l,r,m+1,R,sum<<1|1);
    return l1>r1?l1:r1;

}
void update(int l,int r,int sum,int id,int score)
{
    if(l==r) {stu[sum]=score;return ;}
    int m=(l+r)>>1;
    if(id<=m) update(l,m,sum<<1,id,score);
    else update(m+1,r,sum<<1|1,id,score);
   stu[sum]=max(stu[sum<<1],stu[sum<<1|1]);
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
      create(1,n,1);
     char sp[2];
     while(m--)
      {
          scanf("%s%d%d",sp,&a,&b);
          if(sp[0]=='Q')
            printf("%d\n",quary(a,b,1,n,1));
          else
            update(1,n,1,a,b);
      }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机的小粽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值