主席树板子
Posted mjc191812
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主席树板子相关的知识,希望对你有一定的参考价值。
1 #include <bits/stdc++.h> 2 #define maxn 200010 3 using namespace std; 4 int ent,n,m,l,r,k; 5 int L[maxn],R[maxn],sum[maxn];//×ó¶ù×Ó ÓÒ¶ù×Ó ½ÚµãÖµ 6 int a[maxn],hash[maxn];//ÔÊý×é ÀëÉ¢»¯ºóÊý×é 7 int type[maxn];//ÀúÊ·°æ±¾¸ù½Úµã 8 int built(int l,int r) 9 { 10 int num=++ent; 11 if(l!=r) 12 { 13 int mid=l+((r-l)>>1); 14 L[num]=built(l,mid); 15 R[num]=built(mid+1,r); 16 } 17 return num; 18 } 19 int update(int pre,int l,int r,int x) 20 { 21 int num=++ent; 22 L[num]=L[pre];R[num]=R[pre];sum[num]=sum[pre]+1; 23 if(l!=r) 24 { 25 int mid=(l+r)>>1; 26 if(x<=mid)L[num]=update(L[pre],l,mid,x); 27 else R[num]=update(R[pre],mid+1,r,x); 28 } 29 return num; 30 } 31 int question(int u,int v,int l,int r,int k) 32 { 33 if(l==r)return hash[l]; 34 int mid=l+((r-l)>>1); 35 int num=sum[L[v]]-sum[L[u]]; 36 if(k<=num) return question(L[u],L[v],l,mid,k); 37 else return question(R[u],R[v],mid+1,r,k-num); 38 } 39 int main() 40 { 41 cin>>n>>m; 42 for(int i=1;i<=n;i++){cin>>a[i];hash[i]=a[i];} 43 sort(hash+1,hash+1+n); 44 int size=unique(hash+1,hash+1+n)-(hash+1); 45 type[0]=built(1,size); 46 for(int i=1;i<=n;i++) 47 { 48 int x=lower_bound(hash+1,hash+1+size,a[i])-hash; 49 type[i]=update(type[i-1],1,size,x); 50 } 51 while(m--) 52 { 53 cin>>l>>r>>k; 54 printf("%d ",question(type[l-1],type[r],1,size,k)); 55 } 56 return 0; 57 }
以上是关于主席树板子的主要内容,如果未能解决你的问题,请参考以下文章