poj 2104 主席树 详解
2017-11-22 11:09
204 查看
这篇代码来自链接
接下来主要说说我的理解。
主席树是一种线段树的前缀和,充分利用了先前节点来节省空间。每个节点存放了区间(离散化)中有多少个数。
接下来主要说说我的理解。
主席树是一种线段树的前缀和,充分利用了先前节点来节省空间。每个节点存放了区间(离散化)中有多少个数。
#include <cstdio> #include <iostream> #include <cstring> #include <queue> #include <cmath> #include <algorithm> using namespace std; const int maxn=1e5+6; int n,m; int cnt=0;//节点的编号 int root[maxn];//第i个数存放的结点位置。 int a[maxn],x,y,k; struct node{ int l,r,sum; }T[maxn*40];//通常比线段树需要更大的空间。 //结构体中的l表示左孩子节点(左半区间)的编号,r表示右孩子节点(右半区间)编号,sum表示在区间(离散化)内有多少个数。 vector<int>v;//存放离散化后的数组。 int getid(int x) { return lower_bound(v.begin(),v.end(),x)-v.begin()+1; } void update(int l,int r,int &x,int y,int pos)//这里是&x,表示别名,可直接对结构体数组的l,r进行修改 { T[++cnt]=T[y],T[cnt].sum++,x=cnt; if(l==r) return ; int mid=(l+r)/2; if(mid>=pos) update(l,mid,T[x].l,T[y].l,pos); else update(mid+1,r,T[x].r,T[y].r,pos); } int query(int l,int r,int x,int y,int k){ if(l==r) return l; int mid=(l+r)/2; int sum=T[T[y].l].sum-T[T[x].l].sum; if(sum>=k) return query(l,mid,T[x].l,T[y].l,k);//如果左半区间数的个数小于k,则在左半区间查找,否则查找右半区间第k-sum个数。 else return query(mid+1,r,T[x].r,T[y].r,k-sum); } int main() { // #ifndef ONLINE_JUDGE // freopen("in.txt","r",stdin); // #endif scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]),v.push_back(a[i]); sort(v.begin(),v.end()); /*unique只是把重复的元素放到容器的后面,而它本身会返回一个迭代器, 只向这些元素的开始部分。因此要向真正删除这些元素, 还是要“手工”处理一下。可以用vector的erase*/ v.erase(unique(v.begin(),v.end()),v.end()); //去重 for(int i=1;i<=n;i++) update(1,n,root[i],root[i-1],getid(a[i])); //for(int i=0;i<=n;i++) cout<<root[i]<<" "; for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&k); printf("%d\n",v[query(1,n,root[x-1],root[y],k)-1]); } }
相关文章推荐
- 【POJ 2104】K-th Number&主席树详解
- 【POJ 2104 K-th Number】+ 主席树
- POJ 2104 K-th Number 主席树 静态区间第K大
- poj 2104 主席树(初学题目)
- poj 2104 主席树first blood
- POJ 2104 K-th Number 静态主席树(裸
- poj 2104 主席树(区间第k大)
- POJ 2104(主席树)
- poj 2104 K-th Number 主席树+超级详细解释
- poj2761&&poj2104 主席树(静态区间第K大)
- poj 2104 主席树first blood
- POJ 2104 K-th Number 主席树
- poj 2104(主席树)
- poj 2104 主席树(区间第k大)
- poj 2104 K-th Number (主席树学习第一弹)
- 主席树 poj 2104 K-th Number
- POJ 2104 K-th Number [主席树入门]【数据结构】
- K-th Number POJ - 2104 主席树
- 主席树模板poj 2104
- POJ 2104 K-th Number (主席树 || 划分树)