POJ 3264(线段树求区间内最大值和最小值)
2015-07-12 13:34
393 查看
题目链接:http://poj.org/problem?id=3264 题意:求解区间【a,b】内最大值和最小值的差值 解题思路:建立线段树,每个节点包含max和min,再按照一般线段树的方法即可 #include "stdio.h" #include "stdlib.h" #define N 50005 int man,mnn; int maxn(int a,int b){return a>b?a:b;} int minn(int a,int b){return a>b?b:a;} struct node{ int min,max,left,right; }; struct node tree[N<<2]; void build(int k,int l,int r)//建立线段树 { tree[k].left=l;tree[k].right=r; tree[k].max=tree[k].min=0; if(l==r) return; int mid=(l+r)>>1; build(k<<1, l, mid); build(k<<1|1, mid+1, r); } void update(int k,int pos,int height) //更新线段树 { int l=tree[k].left,r=tree[k].right; if(l==r){ tree[k].max=tree[k].min=height; return; } int mid=(l+r)>>1; if(pos<=mid) update(k<<1, pos, height); else update( k<<1|1, pos, height); tree[k].max=maxn(tree[k<<1].max,tree[k<<1|1].max); tree[k].min=minn(tree[k<<1].min,tree[k<<1|1].min); } void conut(int k,int ll,int rr)//统计范围内最大值以及最小值 { int l=tree[k].left,r=tree[k].right; if(ll<=l&&rr>=r){ man=maxn(man, tree[k].max); mnn=minn(mnn,tree[k].min); return; } int mid=(l+r)>>1; if(ll<=mid) conut(k<<1, ll, rr); if(rr>mid) conut(k<<1|1,ll, rr); } int main() { int n,q; scanf("%d%d",&n,&q); build(1, 1, n); for(int i=1;i<=n;i++) { int temp; scanf("%d",&temp); update(1, i, temp); } for(int i=0;i<q;i++) { int l,r; man=0;mnn=99999999; scanf("%d%d",&l,&r); conut(1,l,r); printf("%d\n",man-mnn); } return 0; }
相关文章推荐
- c的格式输出“%”
- Intelligence System (hdu 3072 强联通缩点+贪心)
- 纯净版windows8安装包下载
- Eclipse 连接Oracle数据库
- 百度,信鸽推送,百度短网址API
- 线段树模板&&树状数组模板
- 南阳oj 题目217 a letter and a number
- Floyd-Warshall 算法-- 最短路径(适合节点密集的图)
- 跟着实例学习设计模式(5)-工厂方法 、抽象工厂的区别
- jquery ajax#使用笔记
- Android ViewPager使用
- tomcat WEB容器安全设置
- python IDE
- 10.Callable与Future的应用
- Ubuntu 12.04.1 LTS 系统添加程序启动器
- java微信js SDK页面签名
- 面向东盟优势凸显 互联网金融企业抢滩南宁
- js 对象创建及其继承的方法
- 将sensor_msgs::Image转换为IplImage
- 将sensor_msgs::Image转换为IplImage