主席树模板(区间第k小)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主席树模板(区间第k小)相关的知识,希望对你有一定的参考价值。
#include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 200010 using namespace std; int n,m,cnt; struct Tree { int l,r,sum; }T[MAXN*60]; int rank[MAXN],root[MAXN]; struct data { int val,ind; bool operator < (const data &a) const { return val<a.val; } }a[MAXN]; void insert(int &num,int &x,int l,int r) { T[cnt++]=T[x]; x=cnt-1; T[x].sum++; if(l==r) return; int mid=(l+r)/2; if(num<=mid) insert(num,T[x].l,l,mid); else insert(num,T[x].r,mid+1,r); } int query(int i,int j,int k,int l,int r) { if(l==r) return l; int t=T[T[j].l].sum-T[T[i].l].sum; int mid=(r+l)/2; if(k<=t) return query(T[i].l,T[j].l,k,l,mid); else return query(T[i].r,T[j].r,k-t,mid+1,r); } int main() { T[0].l=T[0].r=T[0].sum=root[0]=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i].val); a[i].ind=i; } sort(a+1,a+n+1); for(int i=1;i<=n;i++) { rank[a[i].ind]=i; } cnt=1; for(int i=1;i<=n;i++) { root[i]=root[i-1]; insert(rank[i],root[i],1,n); } while(m--) { int i,j,k; scanf("%d%d%d",&i,&j,&k); printf("%d\n",a[query(root[i-1],root[j],k,1,n)].val); } }
以上是关于主席树模板(区间第k小)的主要内容,如果未能解决你的问题,请参考以下文章
洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)