hdu5443 线段树求区间最大

本文介绍了一种使用线段树进行区间最大值查询的方法。通过构建线段树,可以高效地解决给定区间内最大值的问题。文章提供了完整的代码实现,包括线段树的建立、区间查询和节点更新等关键步骤。
部署运行你感兴趣的模型镜像

题目大意:给你一些水源,让你求给定区间当中的最大值。

算法思想:线段树求区间最大。

#include<iostream>
#include<cstdio>
using namespace std;

typedef struct Node
{
    int value;
    int l;
    int r;

};
Node tree[1050*4];
int a[10050];
void build_tree(int v,int l,int r)
{
    tree[v].l=l;
    tree[v].r=r;
    if(l==r)
    {
        tree[v].value=a[l];
        return;
    }
    else
    {
        int mid=(l+r)/2;
        build_tree(v*2,l,mid);
        build_tree(v*2+1,mid+1,r);
        tree[v].value=max(tree[v*2].value,tree[v*2+1].value);
    }
}
int query(int v,int l,int r)
{
    if(tree[v].l==l&&tree[v].r==r)
    {
        return tree[v].value;
    }

    int mid=(tree[v].l+tree[v].r)/2;
    if(r<=mid)
    {
        query(v*2,l,r);
    }
    else
    {
        if(l>mid)
            query(v*2+1,l,r);
        else
        {
            int max1=query(v*2,l,mid);
            int max2=query(v*2+1,mid+1,r);
            return max(max1,max2);
        }
    }


}
void update(int v,int add,int p)
{
    if(tree[v].l==tree[v].r)
    {
        tree[v].value+=add;
        return;
    }
    int mid=(tree[v].l+tree[v].r)/2;

    if(p<=mid)
        update(v*2,add,p);
    else
        update(v*2+1,add,p);
    tree[v].value=tree[v*2].value+tree[v*2+1].value;


}
int t,n,q;
int main()
{
    scanf("%d",&t);
    while(t--)
    {

        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        build_tree(1,1,n);
        scanf("%d",&q);
        int l,r;
        for(int i=1;i<=q;i++)
        {
            scanf("%d%d",&l,&r);
            int ans=query(1,l,r);
            printf("%d\n",ans);
        }

    }

    return 0;

}

 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值