主席树,wokule

我相信人类的潜力是无限的,呜呜呜,这么简单的主席树我竟然要看5,6个小时才勉强搞懂。tot=0;

1:对于一串数,按照大小给予序号,例如

a:1  3  7  6  2  9  10

->>a:  1  3  5  4  2  6  7

2:建空树: p =++tot;

        

嘤,if(l

        t[p].l=build(l,mid);

        t[p].r=build(mid+1,r);

t[p].v=0;//刚开始是空的,所以没有数值

return p;//返回下标。

3.更新 ,呜呜呜

        update(pre,l,r,v)上一个根节点下标 pre,l ,r, v:

                先将上一根节点节点的左右节点引接至该节点。当然多一个数,v值也加一。

            p=++tot;

            t[p].l=t[pre].l;   t[p].r=t[pre].r;

            当然数值加一洛

            t[p].v=t[pre].v+1;

            if(l

            if(v <= mid) 即左子树是不同与上一个根节点的左子树的。他的值要加一:t[p].l=update(t[pre].l,l,mid,v);

             else  即右子树不同,要加一。t[p].r=update(t[pre].r,mid+1,r,v);//返回的都是下标,注意了.

}

return p;

4.查找:

 query(int x,int y,int l,int r,int k){

    if(l==r)return l;//找到了

    int sum=t[t[y].l].v-t[t[x].l].v; //就是T[r]的左节点的值减去T[l-1]左节点的值。。。是【L,R】区间内左节点代表区间的数的增加的个数

    if(k<=sum) return query(t[x].l,t[y].l,l,mid,k);代表第k小的数在左子树上。

    else return query(t[x].r,t[y].r,mid+1,r,k-sum);

}

到此步为止,一切都好了,呜呜呜,我好菜。

你可能感兴趣的:(主席树,wokule)