主席树模板

Posted adelalove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主席树模板相关的知识,希望对你有一定的参考价值。

这里没有思想,没有光,没有热,只有寒冷和永无止境的黑暗。

还有.赤裸裸的主席树代码(求区间第K大)

注意保险起见内存开30倍

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<queue>
 6 #include<cstring>
 7 #include<string>
 8 #include<map>
 9 #define ll long long
10 #define DB double
11 #define eps 1e-3
12 #define inf 2147483647
13 #define mod  100000007
14 using namespace std;
15 inline int read()
16 {
17     int x=0,w=1;char ch=getchar();
18     while(!isdigit(ch)){if(ch==-) w=-1;ch=getchar();}
19     while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-0,ch=getchar();
20     return x*w;
21 }
22 const int N=2e5+10;
23 int n,Q,k;
24 int cnt,a[N],b[N],ls[N*30],rs[N*30],sum[N*30];
25 int rt[N*30];
26 void add(int &nw,int last,int l,int r,int p)
27 {
28     nw=++cnt;
29     ls[nw]=ls[last];rs[nw]=rs[last];
30     sum[nw]=sum[last]+1;
31     if(l==r) return;
32     int mid=(l+r)>>1;
33     if(p<=mid) add(ls[nw],ls[last],l,mid,p);
34     else add(rs[nw],rs[last],mid+1,r,p);
35 }
36 int query(int x,int y,int l,int r,int k)
37 {
38     if(l==r) return l;
39     int mid=(l+r)>>1;
40     int u=sum[ls[y]]-sum[ls[x]];
41     if(k<=u) return query(ls[x],ls[y],l,mid,k);
42     else return query(rs[x],rs[y],mid+1,r,k-u);
43 }
44 int main()
45 {
46     n=read();Q=read();
47     for(int i=1;i<=n;++i) a[i]=read(),b[i]=a[i];
48     sort(b+1,b+n+1);
49     k=unique(b+1,b+n+1)-b-1;
50     for(int i=1;i<=n;++i)
51      a[i]=lower_bound(b+1,b+k+1,a[i])-b;
52     for(int i=1;i<=n;++i)
53      add(rt[i],rt[i-1],1,k,a[i]);
54     while(Q--)
55     {
56         int l,r,x;l=read();r=read();x=read();
57         int pos=query(rt[l-1],rt[r],1,k,x);
58         printf("%d\n",b[pos]);
59     }
60     return 0;
61 }

…φ(?????)? 学习是我的全部

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

Yangk's 静态主席树-模板

主席树模板

P3834 模板可持久化线段树 1(主席树)

POJ 2104 K-th Number 主席树模板题

LUOGU P3834 模板可持久化线段树 1(主席树)

主席树模板