zoukankan      html  css  js  c++  java
  • 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/
      本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    stagefright框架 Video Playback的流程
    ubuntu 10.10 安装 无线网卡驱动
    ffmpeg 播放 m3u8 ts 流时 av_read_frame 流程
    错误:expected classname before ‘{’ token
    avcodec_decode_video2 第三个参数 got_picture_ptr 的含义
    ndk 编译 ffmpeg
    Windows Phone 7中用好Silverlight开发利器
    利用Visual Studio 2010流程模板实现Scrum敏捷开发(下)
    VS2010中使用IntelliTrace来进行调试
    在Windows Azure中实现和调试一个WCF服务(下)
  • 原文地址:https://www.cnblogs.com/shaokele/p/9917682.html
Copyright © 2011-2022 走看看