• luoguP3834 【模板】可持久化线段树 1(主席树)



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

      Time Limit: 1 Sec
      Memory Limit: 256 MB

    Description###

       这是个非常经典的主席树入门题——静态区间第K小
       数据已经过加强,请使用主席树。同时请注意常数优化
      如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值。
     

    Input###

       第一行包含两个正整数N、M,分别表示序列的长度和查询的个数。
       第二行包含N个正整数,表示这个序列各项的数字。
       接下来M行每行包含三个整数 l, r, k, 表示查询区间[l, r]内的第k小值。
     

    Output###

       输出包含k行,每行1个正整数,依次表示每一次查询的结果

    Sample Input###

       5 5
       25957 6405 15770 26287 26465
       2 2 1
       3 4 1
       4 5 1
       1 2 2
       4 4 1
      

    Sample Output###

      6405
      15770
      26287
      25957
      26287

    HINT

      数据范围:
      对于20%的数据满足:(1 leq N, M leq 10)
      对于50%的数据满足:(1 leq N, M leq 10^3)
      对于80%的数据满足:(1 leq N, M leq 10^5)
      对于100%的数据满足:(1 leq N, M leq 2cdot 10^5)
      对于数列中的所有数(a_i) ,均满足 (-{10}^9 leq a_i leq {10}^9)
      样例数据说明:
      N=5,数列长度为5,数列从第一项开始依次为([25957, 6405, 15770, 26287, 26465 ])
      第一次查询为([2, 2])区间内的第一小值,即为6405
      第二次查询为([3, 4])区间内的第一小值,即为15770
      第三次查询为([4, 5])区间内的第一小值,即为26287
      第四次查询为([1, 2])区间内的第二小值,即为25957
      第五次查询为([4, 4])区间内的第一小值,即为26287

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

    题目大意: 题目很简洁了:)

    题解:

      复习模板题 ing


    AC代码

    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    const int N=2e5+5,NlogN=36e5;
    int n,Q;
    int a[N],A[N];
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int Knum=0,sum[NlogN],rt[N],ch[NlogN][2];
    void change(int u,int &v,int l,int r,int val){
        v=++Knum;
        sum[v]=sum[u]+1;
        ch[v][0]=ch[u][0];
        ch[v][1]=ch[u][1];
        if(l==r)return;
        int mid=(l+r)>>1;
        if(val<=mid)change(ch[u][0],ch[v][0],l,mid,val);
        else change(ch[u][1],ch[v][1],mid+1,r,val);
    }
    int query(int L,int R,int K,int l,int r){
        if(l==r)return l;
        int mid=(l+r)>>1;
        int x=sum[ch[R][0]]-sum[ch[L][0]];
        if(K<=x)return query(ch[L][0],ch[R][0],K,l,mid);
        else return query(ch[L][1],ch[R][1],K-x,mid+1,r);
    }
    int main(){
        n=read(),Q=read();
        for(int i=1;i<=n;i++)
            a[i]=A[i]=read();
        sort(A+1,A+n+1);
        int All=unique(A+1,A+n+1)-A-1;
        for(int i=1;i<=n;i++)
            a[i]=lower_bound(A+1,A+All+1,a[i])-A;
        for(int i=1;i<=n;i++)
            change(rt[i-1],rt[i],1,All,a[i]);
        while(Q--){
            int L=read(),R=read(),K=read();
            printf("%d
    ",A[query(rt[L-1],rt[R],K,1,All)]);
        }
        return 0;
    }
    


      作者:skl_win
      出处:https://www.cnblogs.com/shaokele/
      本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    新概念第二册(1)--英语口语听力课1
    外企面试课程(一)---熟悉常见的缩略词
    公司 邮件 翻译 培训 长难句 结课
    workflow
    公司 邮件 翻译 培训 长难句 20
    公司 邮件 翻译 培训 长难句 19
    Engineering Management
    公司 邮件 翻译 培训 长难句 18
    公司 邮件 翻译 培训 长难句 17
    第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头
  • 原文地址:https://www.cnblogs.com/shaokele/p/9917682.html
Copyright © 2020-2023  润新知