首先借主席树发明人的一段话:
..这个东西是当初我弱不会划分树的时候写出来替代的一个玩意..被一小撮别有用心的人取了很奇怪的名字> <
想法是对原序列的每一个前缀[1..i]建立出一颗线段树维护值域上每个数的出现次数,然后发现这样的树是可以减的,然后就没有然后了
转载请注明出处,谢谢。
http://blog.csdn.net/sprintfwater/article/details/9162041
首先定义:
a[MAXN],a2[MAXN];
struct node
{
node *ch[2];
int siz;
node(){ch[0]=ch[1]=NULL;siz=0;}
node(node *_ch0,node *_ch1,int _siz):siz(_siz){ch[0]=_ch0,ch[1]=_ch1;}
void update()
{
if (ch[0]) siz+=ch[0]->siz;
if (ch[1]) siz+=ch[1]->siz;
}
}*null=new node(),*root[MAXN]={NULL};
自己理解:
1:前提条件:有N个数字,size个不同的数字。
2:用a[N]存储原来的数字,a2[size]存储排好序的数字&