zoukankan      html  css  js  c++  java
  • LuoguP3834 【模板】可持久化线段树 1(主席树)|| 离散化

    题目:【模板】可持久化线段树 1(主席树)

    不知道说啥。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 const int maxn=(2e5)+50,maxm=maxn;
     7 int N,M,K,num_treenode=0,root[maxn],X,B[maxn],num=0,L,R,ans,F[maxn];
     8 inline int rd(){
     9     int x=0,f=1;char c=getchar();
    10     while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
    11     while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
    12     return f*x;
    13 }
    14 struct Tree{
    15     int l,r,data,ls,rs;
    16 }t[(maxn<<2)+maxm*19];
    17 struct Num{
    18     int id,data;
    19 }A[maxn];
    20 inline void Build(int x,int l,int r){
    21     t[x].l=l;t[x].r=r;
    22     if(l==r)return;
    23     int mid=(l+r)>>1;
    24     Build(t[x].ls=++num_treenode,l,mid); Build(t[x].rs=++num_treenode,mid+1,r);
    25     return;
    26 }
    27 inline bool cmp(const Num&a,const Num&b){return(a.data<b.data);}
    28 inline void Update(int u,int x,int q){
    29     int l,r,mid;
    30     t[x].l=l=t[u].l;t[x].r=r=t[u].r;mid=(l+r)>>1;
    31     if(l==r&&l==q){t[x].data=t[u].data+1; return;}
    32     if(q<=mid){t[x].rs=t[u].rs; Update(t[u].ls,t[x].ls=++num_treenode,q);}
    33           else{t[x].ls=t[u].ls; Update(t[u].rs,t[x].rs=++num_treenode,q);}
    34     t[x].data=t[t[x].ls].data+t[t[x].rs].data;
    35     return;
    36 }
    37 inline int Query(int r1,int r2,int k){
    38     int l=t[r1].l,r=t[r1].r,ls=t[r1].ls,rs=t[r1].rs,ls_=t[r2].ls,rs_=t[r2].rs,sum=t[ls_].data-t[ls].data;
    39     if(l==r)return l;
    40     if(k<=sum)return Query(ls,ls_,k);else return Query(rs,rs_,k-sum);
    41 }
    42 int main(){
    43     N=rd();M=rd();
    44     root[0]=++num_treenode;
    45     Build(num_treenode,1,N);
    46     for(int i=1;i<=N;i++){
    47         A[i].data=rd();
    48         A[i].id=i;
    49     }
    50     sort(A+1,A+N+1,cmp);
    51     A[0].data=int(1e9);
    52     for(int i=1;i<=N;i++)
    53         if(A[i].data!=A[i-1].data) B[A[i].id]=++num,F[num]=A[i].data;else B[A[i].id]=num;//find是离散化后的数对应的原数是什么 
    54     for(int i=1;i<=N;i++)Update(root[i-1],root[i]=++num_treenode,B[i]);
    55     while(M--){
    56         L=rd();R=rd();K=rd();
    57         ans=Query(root[L-1],root[R],K);
    58         printf("%d
    ",F[ans]);
    59     }
    60     return 0;
    61 }

    By:AlenaNuna

  • 相关阅读:
    linux (debian) 配置静态ip
    使用yum高速部署Oracle安装环境(11g)
    shell 例程 —— 解决redis读取稳定性
    面向对象的设计模式(六),状态模式
    python调用shell命令之三慷慨法
    Codeforces Round #316 (Div. 2) C. Replacement(线段树)
    vim随想笔记(1)
    JavaSE入门学习12: Java面相对象之static使用方法
    软件架构————架构核对表
    模板管理类
  • 原文地址:https://www.cnblogs.com/AlenaNuna/p/10390962.html
Copyright © 2011-2022 走看看