主席树板子

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 }

 

以上是关于主席树板子的主要内容,如果未能解决你的问题,请参考以下文章

主席树板子

CF840D[Destiny] [主席树板子]

主席树板子二

主席树板子题区间第k小

P2617 Dynamic Rankings(带修主席树)

主席树模板