区间第k小 poj2104 可持久化线段树
2017-12-07 21:20
246 查看
题目大意
给出一排数,求区间第k小值分析
可持久化线段树的入门题可持久化线段树其实就是每一次进行修改操作都新建一棵线段树,而该线段树与前一棵线段树相比就只有logn个节点是不同的,所以其他节点就可以接到前一棵线段树上。
然后每一棵线段树储存的都是在当前时刻每个区间含有的元素的数量,那么我们查找区间x到y的第k小值时就相当于查找第y棵线段树-第x棵线段树的第k小值。
教程
code
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> using namespace std; const int maxn=100000+10; struct arr{ int lc,rc; int l,r; int s; }tree[maxn*20]; int tot; int root[maxn]; int rank[maxn]; int a[maxn],b[maxn]; int n,m; void build(int &x,int l,int r) { x=++tot; tree[x].s=0; tree[x].l=l,tree[x].r=r; if (l==r) return; int mid=(l+r)/2; build(tree[x].lc,l,mid); build(tree[x].rc,mid+1,r); return; } void insert(int &x,int y,int q) { x=++tot; tree[x].s=tree[y].s+1; tree[x].l=tree[y].l,tree[x].r=tree[y].r; tree[x].lc=tree[y].lc,tree[x].rc=tree[y].rc; if (tree[x].l==tree[x].r) return; int mid=(tree[x].l+tree[x].r)/2; if (mid>=q) insert(tree[x].lc,tree[y].lc,q); else insert(tree[x].rc,tree[y].rc,q); return; } int find(int x,int y,int q) { int p=tree[tree[y].lc].s-tree[tree[x].lc].s; if (tree[x].l==tree[x].r) return tree[x].l; if (p>=q) return find(tree[x].lc,tree[y].lc,q); else return find(tree[x].rc,tree[y].rc,q-p); } bool cmp(int a,int b) { return a<b; } int two(int x) { int l=1,r=n; while (l<=r) { int mid=(l+r)/2; if (b[mid]==x) return mid; if (b[mid]<x) l=mid+1; else r=mid-1; } } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=a[i]; } sort(b+1,b+1+n,cmp); tot=0; build(root[0],1,n); for (int i=1;i<=n;i++) { rank[i]=two(a[i]); insert(root[i],root[i-1],rank[i]); } for (int i=1;i<=m;i++) { int x,y,k; scanf("%d%d%d",&x,&y,&k); printf("%d\n",b[find(root[x-1],root[y],k)]); } return 0; }
相关文章推荐
- 【可持久化线段树】POJ2104 查询区间第k小值
- POJ2104-K-th Number-区间第k大-可持久化线段树/主席树
- 可持久化线段树(主席树)(图文并茂详解)【poj2104】【区间第k大】
- 可持久化线段树(主席树)(图文并茂详解)【poj2104】【区间第k大】
- hdu2665 求区间第k大(小?)【主席树or可持久化线段树or函数式线段树】
- hdu 2665 可持久化线段树求区间第K大值(函数式线段树||主席树)
- 可持久化线段树|主席树 POJ 2104 区间第k大的数
- POJ- 2104 hdu 2665 (区间第k小 可持久化线段树)
- 可持久化线段树——Step 1 静态区间第K大
- 可持久化线段树入门题 hdu2665 求区间第k小的数
- POJ 2104 可持久化线段树 求区间第k大
- 【可持久化线段树】poj 2104 静态区间第k大
- 【poj2104-求区间第k大数(不修改)】主席树/可持续化线段树
- 【51nod1175】【区间中的第k大的数】【可持久化线段树】
- 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)
- 【bzoj4571: [Scoi2016]美味】区间异或和最大 ,可持久化线段树(主席树)
- hdu 5412 CRB and Queries(线段树套笛卡尔树 - 动态区间第k大)
- 【转】pku 2104 K-th Number 求某区间第k小数 归并排序+线段树
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase【可持久化线段树,区间取反
- BZOJ 1901(Zju2112 Dynamic Rankings-区间第k大(修改,在线)-函数式线段树)