1. 程式人生 > >基礎之基礎線段樹

基礎之基礎線段樹

線段樹 記錄 namespace ++ 個數 n) nod while code

這是關於線段樹的某一實際應用。

其中涉及到,線段樹的建立,線段樹的查詢(此題用的是查詢之後的更新),當然正規全面的線段樹還有修改等操作,我僅僅是萬分之一吧。

轉載一位大佬的博客 :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; }

基礎之基礎線段樹