高級數據結構-線段樹
阿新 • • 發佈:2018-02-15
printf 最小值 spa 當前 names 其他 pan 情況 scanf
1.模板(以維護最小值為例)
#include<iostream> #include<stdio.h> #define LEN 11 #define MAX 1<<30 using namespace std; int arr[LEN]={1,3,7,6,8,5,3,2,7,2,9}; int st[LEN*3]; //segment tree int n; void init(int len){ n=1; while(n<len) n*=2; //不斷乘以2,知道>=len for(int i=0;i<n;i++) st[i]=MAX; }void update(int p,int v){ //我們有n(len的二次冪擴增)個葉子作為線段元素 p+=n-1; //地址重定向,變為葉子節點所在地址 st[p]=v; while(p>0){ p=(p-1)/2; //向上跳轉到父節點 st[p]=min(st[p*2+1],st[p*2+2]); //更新父節點 } } // 查詢[a,b)的最小值,當前函數的查詢是[l,r) 。當前根節點為p int query(int a,int b,int p,int l,int r){//外部調用: query(a,b,0,0,n)//如果[a,b)與[l,r)不相交 if(a>=r || b<=l) return MAX; //如果[a,b)包裹住了[l,r) if(a<=l && b>=r) return st[p]; //其他情況,二分進行查詢 int v1=query(a,b,p*2+1,l,(l+r)/2); int v2=query(a,b,p*2+2,(l+r)/2,r); return min(v1,v2); } int main(){ init(LEN); int i,a,b;for(i=0;i<LEN;i++) update(i,arr[i]); while(1){ scanf("%d%d",&a,&b); printf("%d\n",query(a,b,0,0,n)); } return 0; }
2.POJ Crane
高級數據結構-線段樹