POJ3264线段树求最值

刚开始还觉得有点怪怪的。因为想着如果每个树只是单纯地记录它所在的区间的话会不会有不在区间内的数据给更新了,但是我好像是傻掉了因为如果有这种情况出现的话在父亲节点就会分成l,mid和mid+1,r两个区间查找,当节点区间和查找的区间完全吻合时就ok了。

这道题没有修改,连懒标记都不需要,是一道实打实的板子我却浪费了这么长时间我恨我自己

复制代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<ctype.h>
#include<cstring>
using namespace std;

const int maxn=50005;
inline int read()
{
    int x=0,w=0;char c=getchar();
    while(!isdigit(c))w|=c=='-',c=getchar();
    while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return w?-x:x;
}
struct SegmentTree
{
    struct Node{
        int l,r;
        int mx,mn;
        int tagmx,tagmn;
    }e[4*maxn];
    #define ls (ro<<1)
    #define rs (ro<<1|1)
    #define INF 0x3f3f3f3f
    
    int maxx,minn;
    int n,m;
    void build(int ro,int l,int r)
    {
        e[ro].l=l,e[ro].r=r;
        e[ro].mn=INF,e[ro].mx=-INF;
        if(l==r)return ;
        int mid=(l+r)>>1;
        build(ls,l,mid);
        build(rs,mid+1,r);
    }
    void insert(int ro,int i,int k)
    {
        if(e[ro].l==e[ro].r){
            e[ro].mx=e[ro].mn=k;return;
        }
        e[ro].mn=min(e[ro].mn,k);
        e[ro].mx=max(e[ro].mx,k);
        int mid=(e[ro].l+e[ro].r)>>1;
        if(i<=mid)insert(ls,i,k);
        else insert(rs,i,k);
    }
    void query(int ro,int l,int r)
    {
        if(e[ro].mn>=minn and e[ro].mx<=maxx)return ;
        if(e[ro].l==l and e[ro].r==r){
            minn=min(minn,e[ro].mn);
            maxx=max(maxx,e[ro].mx);
            return;
        }
        int mid=(e[ro].l+e[ro].r)>>1;
        if(r<=mid)query(ls,l,r);
        else if(l>mid)query(rs,l,r);
        else {query(ls,l,mid);query(rs,mid+1,r);}
    }
    inline void getans()
    {
        n=read();m=read();
        build(1,1,n);
        for(int i=1;i<=n;i++)
            insert(1,i,read());
        for(int i=1;i<=m;i++)
        {
            maxx=-INF,minn=INF;
            int l=read(),r=read();
            query(1,l,r);
            printf("%d\n",maxx-minn);
        }
        return ;
    }
    #undef ls
    #undef rs
    #undef INF
}st;
int main()
{
    st.getans();
    return 0;
}
复制代码

用一下结构体~

posted @   Star_Cried  阅读(161)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示