• [HDU 2665]Kth number


    [HDU 2665]Kth number

    题目

    Give you a sequence and ask you the kth big number of a inteval.

     INPUT

    The first line is the number of the test cases. 
    For each test case, the first line contain two integer n and m (n, m <= 100000), indicates the number of integers in the sequence and the number of the quaere. 
    The second line contains n integers, describe the sequence. 
    Each of following m lines contains three integers s, t, k. 
    [s, t] indicates the interval and k indicates the kth big number in interval [s, t]

    OUTPUT

    For each test case, output m lines. Each line contains the kth big number.

    SAMPLE

    INPUT

    1

    10 1

    1 4 2 3 5 6 7 8 9 0

    1 3 2

    OUTPUT

    2

    解题报告

    初识主席树

    虽然只会静态的2333

     1 #include<algorithm>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cstdio>
     5 using namespace std;
     6 //#define mem(x) memset((x),0,sizeof(x))
     7 inline int read(){
     8     int sum(0);
     9     char ch(getchar());
    10     for(;ch<'0'||ch>'9';ch=getchar());
    11     for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
    12     return sum;
    13 }
    14 int T;
    15 int n,m;
    16 int a[100005],num[100005];
    17 int cnt,size;
    18 int rt[2000005],sum[2000005],lch[2000005],rch[2000005];
    19 inline void clear(){
    20 //    mem(a),mem(num),mem(rt),mem(sum),mem(lch),mem(rch);
    21     cnt=size=n=m=0;
    22 }
    23 inline void build(int &x,int l,int r){
    24     x=++cnt;
    25     sum[x]=0;
    26     if(l==r){
    27         lch[x]=rch[x]=0;
    28         return;
    29     }
    30     int mid((l+r)>>1);
    31     build(lch[x],l,mid);
    32     build(rch[x],mid+1,r);
    33 }
    34 inline void update(int &x,int las,int pos,int l,int r){
    35     x=++cnt;
    36     lch[x]=lch[las];
    37     rch[x]=rch[las];
    38     sum[x]=sum[las]+1;
    39     if(l==r)
    40         return;
    41     int mid((l+r)>>1);
    42     if(pos<=mid)
    43         update(lch[x],lch[las],pos,l,mid);
    44     else
    45         update(rch[x],rch[las],pos,mid+1,r);
    46 }
    47 inline int query(int ll,int rr,int l,int r,int k){
    48     if(l==r)
    49         return l;
    50     int mid((l+r)>>1);
    51     int cnt(sum[lch[rr]]-sum[lch[ll]]);
    52     if(k<=cnt)
    53         return query(lch[ll],lch[rr],l,mid,k);
    54     return query(rch[ll],rch[rr],mid+1,r,k-cnt);
    55 }
    56 int main(){
    57     T=read();
    58     while(T--){
    59         clear();
    60         n=read(),m=read();
    61         for(int i=1;i<=n;++i)
    62             num[i]=a[i]=read();
    63         sort(num+1,num+n+1);
    64         size=unique(num+1,num+n+1)-num-1;
    65         for(int i=1;i<=n;++i)
    66             a[i]=lower_bound(num+1,num+size+1,a[i])-num;
    67         build(rt[0],1,size);
    68         for(int i=1;i<=n;++i)
    69             update(rt[i],rt[i-1],a[i],1,size);
    70         for(int i=1;i<=m;++i){
    71             int l(read()),r(read()),k(read());
    72             int ans(query(rt[l-1],rt[r],1,size,k));
    73             printf("%d
    ",num[ans]);
    74         }
    75     }
    76 }
    View Code
  • 相关阅读:
    CSS的应用
    关于新手html的认识 以及对table的基本用法
    javascript的使用方法
    CSS的使用方式和选择器的用法
    html基础知识点
    前端课堂第四课
    前端课堂第三课
    前端实训第二课
    前端实训随笔
    JS02
  • 原文地址:https://www.cnblogs.com/hzoi-mafia/p/7581607.html
Copyright © 2020-2023  润新知