线段树求解区间最大最小值
2016-04-12 14:59
113 查看
#include <bits/stdc++.h> using namespace std; #define MAXN 256 int min_ar[MAXN*5]; int max_ar[MAXN*5]; int data[MAXN]; void pushUp( int N ) { min_ar = min( min_ar[2 * N], min_ar[2 * N + 1] ); max_ar = max( max_ar[2 * N], max_ar[2 * N + 1] ); } void build( int N, int L, int R ) { if ( L == R ) { min_ar = data[L]; max_ar = data[L]; return; } int M = (L + R) >> 1; build( 2 * N, L, M ); build( 2 * N + 1, M + 1, R ); pushUp( N ); } int query( string type, int N, int L, int R, int l, int r ) { int rs1, rs2; if ( l > R || r < L ) return(-1); if ( L >= l && R <= r ) { if ( type == "min" ) return(min_ar ); else return(max_ar ); } int M = (L + R) >> 1; rs1 = query( type, 2 * N, L, M, l, r ); rs2 = query( type, 2 * N + 1, M + 1, R, l, r ); if ( rs1 == -1 ) return(rs2); if ( rs2 == -1 ) return(rs1); if ( type == "min" ) { if ( rs1 <= rs2 ) return(rs1); return(rs2); } else{ if ( rs1 <= rs2 ) return(rs2); return(rs1); } } int main() { srand( (unsigned) time( NULL ) ); int N = 9; for ( int i = 0; i != N; ++i ) { printf( "%5d ", i ); } printf( "\n" ); for ( int i = 0; i != N; ++i ) { data[i] = rand(); printf( "%5d ", data[i] ); } printf( "\n" ); build( 1, 0, N-1 ); while ( true ) { int x, y; printf( "输入数组查询范围x y\n" ); scanf( "%d%d", &x, &y ); printf( "%d\n", query( "min", 1, 0, N-1, x, y ) ); } return(0); }
相关文章推荐
- Tyvj_P1001
- 2015最流行的Android组件、工具、框架大全
- 看完《极盗者》有点小感触,感叹一下
- 小数转换成百分比
- javadoc解决中文乱码问题
- SWFTools.cs
- 【JS】:JS中的Math对象详解
- 剑指offer系列之27:数组中出现次数超过一半的数字
- Mysql 组合查询 UNION 与 UNION ALL
- stm32后生成编译文件大小探索
- Fresco之强大之余的痛楚
- PhotoView的使用方法
- Jewel 版ceph安装和BlueStore配置
- UVA_11129_An antiarithmetic permutation
- viewpager中彻底性动态添加、删除Fragment
- 使用Markdown编辑器写博客
- TCP/IP(一)基础
- mysql引擎
- 可以拖动的多张图片
- 使用两个栈实现队列