线段树--点更新--点查询--最值差查询--poj3264

本文介绍了一种使用线段树解决区间查询问题的方法,具体实现为查询给定区间内的最大值与最小值,并计算二者之差。通过递归构建和查询线段树的方式,实现了高效的数据结构操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给定顺序输入整数,查询第x到第y个数之前 最大值与最小值的差

思路:

建立线段树。维护每个节点的最大值和最小值 

#include <iostream>
#include <stdio.h>
#define lson i<<1,left,mid
#define rson i<<1|1,mid+1,right
using namespace std;
#define maxn 50010
int cows[maxn];
struct cow
{
    int left;
    int right;
    int highest;
    int lowest;
}Tree[maxn*3];

void Build(int i,int left,int right)
{
    Tree[i].left=left;
    Tree[i].right=right;
    if(left==right)
    {
        Tree[i].highest=cows[left];
        Tree[i].lowest=cows[left];
        return ;
    }
    int mid=(left+right)>>1;
    Build(lson);
    Build(rson);
    Tree[i].highest=max(Tree[i<<1].highest,Tree[i<<1|1].highest);
    Tree[i].lowest=min(Tree[i<<1].lowest,Tree[i<<1|1].lowest);
}
int ans=0,hi,low;
void query(int i,int left,int right)
{
    if(Tree[i].left==left&&Tree[i].right==right)
    {
        hi=max(hi,Tree[i].highest);
        low=min(low,Tree[i].lowest);
      //  cout<<Tree[i].highest-Tree[i].lowest<<"Gg"<<endl;
        return ;
    }
    int mid=(Tree[i].left+Tree[i].right)>>1;
    if(left>mid)
    {
        query(i<<1|1,left,right);
    }
    else if(right<=mid)
    {
        query(i<<1,left,right);
    }
    else
    {
        query(lson);
        query(rson);

    }

}
int main()
{
     int n,q;
     cin>>n>>q;

     int t;
     for(int i=1;i <=n;i++)
     {
         scanf("%d",&cows[i]);
     } Build(1,1,n);
     int x;
     int y;
     while(q--)
     {
         scanf("%d%d",&x,&y);
         low=1000001;
         hi=0;
         query(1,x,y);
         printf("%d\n",hi-low);
     }
     return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值