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; }
用一下结构体~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现