内容简介:题目链接:题目大意:求区间内最大值与最小值之差思路:经典问题,此外还可用线段树做,维护一个变量即可。
题目链接: http://poj.org/problem?id=3264
题目大意:求区间内最大值与最小值之差
思路:经典问题,此外还可用线段树做,维护一个变量即可。
代码():
#include <cstdio> #include <cmath> #include <cctype> #include <cstring> #include <iostream> static const int MAXN=100050; static const int lim=25; int k,n,q,ql,qr,f1[MAXN][lim],f2[MAXN][lim]; inline int read() { int x=0;bool sign=false; char alpha=0; while(!isdigit(alpha)) sign|=alpha=='-',alpha=getchar(); while(isdigit(alpha)) x=(x<<1)+(x<<3)+(alpha^48),alpha=getchar(); return sign?-x:x; } inline int get_max(int a,int b){return a>b?a:b;} inline int get_min(int a,int b){return a<b?a:b;} inline void make_st() { int t=log2(n); for(int j=1;j<=t;j++) for(int i=1;i<=n-(1<<j)+1;i++) { f1[i][j]=get_max(f1[i][j-1],f1[i+(1<<(j-1))][j-1]); f2[i][j]=get_min(f2[i][j-1],f2[i+(1<<(j-1))][j-1]); } } int main() { n=read();q=read(); memset(f1,-1,sizeof(f1)); memset(f2,127/2,sizeof(f2)); for(int i=1;i<=n;i++) f1[i][0]=f2[i][0]=read(); make_st(); for(int i=1;i<=q;i++) { ql=read();qr=read(); k=log2(qr-ql+1); printf("%d\n",get_max(f1[ql][k],f1[qr-(1<<k)+1][k])-get_min(f2[ql][k],f2[qr-(1<<k)+1][k])); } return 0; }
代码(线段树):
#include <cstdio> #include <cctype> #include <cstring> #include <iostream> #define ls p<<1 #define rs p<<1|1 typedef long long ll; static const int MAXN=50050; static const int INF=2147483647; struct node { ll Max,Min; }a[MAXN<<2]; int n,m,ql,qr; inline int read() { int x=0;bool sign=false; char alpha=0; while(!isdigit(alpha)) sign|=alpha=='-',alpha=getchar(); while(isdigit(alpha)) x=(x<<1)+(x<<3)+(alpha^48),alpha=getchar(); return sign?-x:x; } inline int get_max(int a,int b){return a>b?a:b;} inline int get_min(int a,int b){return a<b?a:b;} struct Segment_Tree { inline void push_up(int p) { a[p].Max=get_max(a[ls].Max,a[rs].Max); a[p].Min=get_min(a[ls].Min,a[rs].Min); } void build(int p,int l,int r) { if(l==r) { a[p].Max=a[p].Min=read(); return ; } int mid=(l+r)>>1; build(ls,l,mid); build(rs,mid+1,r); push_up(p); } node query(int p,int l,int r) { if(ql<=l&&qr>=r) return a[p]; ll mid=(l+r)>>1,Max=-INF,Min=INF; node t; if(ql<=mid) t=query(ls,l,mid),Min=get_min(Min,t.Min),Max=get_max(Max,t.Max);; if(qr>mid) t=query(rs,mid+1,r),Min=get_min(Min,t.Min),Max=get_max(Max,t.Max);; t.Max=Max,t.Min=Min; return t; } }Tree; int main() { n=read();m=read(); Tree.build(1,1,n); for(int i=1;i<=m;i++) { ql=read();qr=read(); node x=Tree.query(1,1,n); printf("%lld\n",x.Max-x.Min); } return 0; }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Go语言学习笔记
雨痕 / 电子工业出版社 / 2016-6 / 89
作为时下流行的一种系统编程语言,Go 简单易学,性能很好,且支持各类主流平台。已有大量项目采用 Go 编写,这其中就包括 Docker 等明星作品,其开发和执行效率早已被证明。本书经四年多逐步完善,内容覆盖了语言、运行时、性能优化、工具链等各层面知识。且内容经大量读者反馈和校对,没有明显的缺陷和错误。上卷细致解析了语言规范相关细节,便于读者深入理解语言相关功能的使用方法和注意事项。下卷则对运行时源......一起来看看 《Go语言学习笔记》 这本书的介绍吧!