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

  • 相关阅读:
    Codevs P1501二叉树的最大宽度和高度
    react 脚手架使用
    vue 学习七 组件上使用插槽
    vue 学习 cli3常用配置
    vue 学习五 深入了解components(父子组件之间的传值)
    vue 学习四 了解组件
    vue 学习二 深入vue双向绑定原理
    vue 学习一 组件生命周期
    vscode 常用插件
    解决在移动端上 click事件延迟300 毫秒的问题 fastclick.js
  • 原文地址:https://www.cnblogs.com/AlenaNuna/p/10390962.html
Copyright © 2011-2022 走看看