线段树区间查询
来源:互联网 发布:淘宝账期延长十五天 编辑:程序博客网 时间:2024/06/10 01:32
给定一个区间,判断线段树中的区间在该区间内的最小权值;
查询的思想是选出一些区间,使他们相连后恰好涵盖整个查询区间,因此线段树适合解决“相邻的区间的信息可以被合并成两个区间的并区间的信息”的问题。
这个博客介绍的很好,尤其是下面的举例非常的详细。
[https://www.cnblogs.com/TenosDoIt/p/3453089.html#g]
代码:
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<cmath>#define MAXN 1000using namespace std;int array[MAXN];struct segtreenode{ int value;} segtree[MAXN];void build(int node,int start,int end){ if(start==end) { segtree[node].value=array[start]; } else { int mid=(start+end)>>1; build(2*node,start,mid); build(2*node+1,mid+1,end); segtree[node].value=segtree[2*node].value>segtree[2*node+1].value?segtree[2*node+1].value:segtree[2*node].value; }}int query(int node,int start,int end,int left,int right){ if(left>end||right<start) { return 1000; } if(left<=start&&right>=end) { return segtree[node].value; } int mid=(start+end)>>1; int p1=query(2*node,start,mid,left,right); int p2=query(2*node+1,mid+1,end,left,right); return p1>p2?p2:p1;}int main(){ int n; cin>>n; for(int i=0; i<n; i++) { cin>>array[i]; } build(1,0,n-1); for(int i=1; i<=2*n+3; i++) { cout<<"seg"<<i<<"="<<segtree[i].value<<endl; } int left,right; cin>>left>>right; cout<<query(1,0,n-1,left,right)<<endl;}
阅读全文
0 0
- 线段树区间查询
- 线段树--区间更新区间查询--hdu4027
- 线段树区间修改+区间查询
- 线段树(区间修改,区间查询)
- 线段树区间查询区间更新
- [模板]-线段树-区间修改 + 区间查询
- [线段树][区间修改&&查询]
- 线段树--动态区间查询
- zoj (单点更新区间查询:线段树)
- Codeforces46D(Parking Lot)线段树区间查询
- 线段树-动态查询区间最大和
- hdoj1032 ( 线段树-区间查询)
- HDU1698线段树区间更新,一次查询
- 线段树单点更新和区间查询
- hdu1166(线段树单点更新区间查询)
- POJ 2823 线段树区间查询
- Balanced Lineup (POJ_3264) 线段树+区间查询
- 线段树 区间跟新,查询!
- Angular2搭建环境
- JDK8中的Comparable<T>接口源码分析
- 使用Xib自定义UITableViewCell
- Intellij idea的一些设置
- 详解C中volatile关键字
- 线段树区间查询
- 使用selenium3.X启动firefox浏览器
- b进制运算之一--和
- The more, The Better (树形dp+背包)
- 445. Add Two Numbers II(JAVA)
- 【java多线程编程核心技术】3.线程间通信 -笔记总结
- 3Sum Closest Leetcode
- 前端学习知识要点整理
- Mybatis在控制台显示sql语句配置文件