模板_主席树
来源:互联网 发布:淘宝网店排名查询 编辑:程序博客网 时间:2024/05/16 20:28
主席树是一个十分简单的数据结构,可以统计区间中的第k大,通过线段树的加减来实现,有n棵线段树来维护,S表示数的种数,线段树维护的就是每种数的个数
关于主席树讲解:传送门
struct Node{ Node *ch[2];int size; Node(){ch[0]=ch[1]=NULL,size=0;} Node(Node *ch0,Node *ch1,int s){ size=s;ch[0]=ch0,ch[1]=ch1; } void Updata(){ if(ch[0]) size+=ch[0]->size;if(ch[1]) size+=ch[1]->size; }}*root[N],*null=new Node(),q[N*9];int cnt;int n,m,S;int a[N],a2[N];void Build(Node *&now,Node *&last,int l,int r,int k){ if(last==NULL) last=null; now=&q[++cnt];int m=(l+r)>>1; if(l==r){*now=*last,now->size++;return;} if(k<=a2[m]){ Build(now->ch[0],last->ch[0],l,m,k); now->ch[1]=last->ch[1];now->Updata(); } else{ Build(now->ch[1],last->ch[1],m+1,r,k); now->ch[0]=last->ch[0];now->Updata(); }}void Find(Node *&L,Node *&R,int l,int r,int k){ if(L==NULL) L=null;if(R==NULL) R=null; if(l==r){printf("%d\n",a2[l]);return;} int m=(l+r)>>1,s=0; if(R->ch[0]) s+=R->ch[0]->size;if(L->ch[0]) s-=L->ch[0]->size; if(s>=k) Find(L->ch[0],R->ch[0],l,m,k); else Find(L->ch[1],R->ch[1],m+1,r,k-s);}void init(){null->ch[0]=null,null->ch[1]=null;}
0 0
- 模板_主席树
- 主席树模板
- 主席树模板poj2104
- 主席树模板题
- 主席树模板
- 【主席树模板】题
- 主席树模板
- hdu2665 主席树模板题
- [POJ2104] 主席树模板题
- 主席树模板题-poj2104
- Luogu-3834 (主席树模板)
- 主席树区间修改模板
- 【模板主席树】洛谷p3834
- 主席树模板 [poj2104]K-th Number
- zoj-2112-Dynamic Rankings主席树模板
- 主席树入门+模板 POJ 2104
- 不带修改主席树模板
- SPOJ DQUERY (主席树模板)
- Android应用程序及其主要结构
- 【js】 古怪的 arguments
- MySQL知识(九)——单表查询
- Bestcoder Round #73 (div.2)
- JAVA多线程-Lock的使用(二)-公平锁与非公平锁
- 模板_主席树
- java中如何输入char类型
- UVa 1586, Molar Mass
- 常用的排序算法
- 计算机专业英语 学习笔记 2
- 面向对象设计的SOLID原则
- hdu 1068 girls and boys(二分图求最大独立集)
- POJ_P2104 K-th Number(主席树)
- 使用Solrj 获取语句分词结果的代码