线段树入门了解

const int max_n=1<<17;
//存储线段树的全局数组
int n,dat[2*MAX_n-1];
//初始化
void init(int n_){
    //把元素扩大到2的幂
    n=1;
    while(n<n_)n*=2;
    //把所有值设为INT_MAX
    for(itn i=0;i<2*n-1;i++) dat[i]=INT_MAX;
}
//把第k个值(0-indexed)更新为a
void update(int k,int a){
    //叶子节点
    k+=n-1;//叶子为n的完全树有n-1个非叶子节点
    dat[k]=a;
//    向上跟新
    while(k>0){
        k=(k-1)/2;
        dat[k]=min(dat[k*2+1],dat[k*2+2]);//注意是下标是从0开始,所以有些变化
    }
}
//求[a,b)的最小值
//后面的参数为了方便计算传入,原则上可以计算出
//k时节点编号,l,r表示[l,r)区间
//外部调用时用query(a,b,0,0,n)
int query(int a,int b,int k,int l,int ,r){
//如果[a,b)和[l.r)不相交,则返回INT_MAX
     if(r<=a||b<=1) return INT_MAX;
     //如果包含返回当前节点的值
     if(a<=l&&r<=b) return dat[k];
     else {
        int v1=query(a,b,k*2+1,l,(l+r)/2);
        int v2=query(a,b,k*2+2,(l+r)/2,r);
        return min(v1,v2);
     }
}

猜你喜欢

转载自www.cnblogs.com/yzbpxx/p/11041694.html