我相信人类的潜力是无限的,呜呜呜,这么简单的主席树我竟然要看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<r) :
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<r)//不是叶子节点,即没有到最下层{
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);
}
到此步为止,一切都好了,呜呜呜,我好菜。