这是关于线段树的某一实际应用。
其中涉及到,线段树的建立,线段树的查询(此题用的是查询之后的更新),当然正规全面的线段树还有修改等操作,我仅仅是万分之一吧。
转载一位大佬的博客 :http://blog.csdn.net/zearot/article/details/48299459
本题大意是不断查询一个数组中一段连续长度的最大值与最小值的差,并输出。
下面为我的代码,比较拙劣。
查询操作,需要不断更新nowmax和nowmin的值,这样记录下来。
其余的都是一些小小的细节。
#include<iostream> #define maxn 1000 typedef struct lnode{ int max; int min; }lnode; lnode node[maxn<<2]; int A[maxn],n; int nowmax=-1,nowmin=100007; using namespace std; int qumax(int a,int b) { return a>b?a:b; } int qumin(int a,int b) { return a>b?b:a; } void pushup(int rt) { node[rt].max=qumax(node[rt<<1].max,node[rt<<1|1].max); node[rt].min=qumin(node[rt<<1].min,node[rt<<1|1].min); } void build(int l,int r,int rt) { if(l==r){ node[rt].max=A[l]; node[rt].min=A[l]; return ; } int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); pushup(rt); } void query(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R){ nowmax=qumax(node[rt].max,nowmax); nowmin=qumin(node[rt].min,nowmin); return; } int m=(l+r)>>1; if(L<=m) query(L,R,l,m,rt<<1); if(R>m) query(L,R,m+1,r,rt<<1|1); } int main() { int n1,m1; while(cin>>n1>>m1){ for(int i=1;i<=n1;++i){ cin>>A[i]; } build(1,n1,1); for(int i=0;i<m1;++i){ int x, y; cin>>x;cin>>y; query(x,y,1,n1,1); cout<<nowmax-nowmin<<endl; nowmax=-1,nowmin=1e7; } } return 0; }