zoukankan      html  css  js  c++  java
  • POJ 2104 K-th Number(主席树求静态区间第k大)

    http://poj.org/problem?id=2104

    主席树裸题没什么好说的,学主席树请看上一篇博客

     1 #include<algorithm>
     2 #include<iostream>
     3 #include<cstdio>
     4 using namespace std;
     5 const int N=1e5+5;
     6 int T;
     7 int n,q;
     8 int a[N],b[N],rt[N],ls[N*32],rs[N*32],sum[N*32];
     9 int cnt,ans;
    10 void up(int &o,int pre,int l,int r,int p){
    11     o=++cnt;
    12     ls[o]=ls[pre];
    13     rs[o]=rs[pre];
    14     sum[o]=sum[pre]+1;
    15     if(l==r)return;
    16     int m=(l+r)/2;
    17     if(p<=m)up(ls[o],ls[pre],l,m,p);
    18     else up(rs[o],rs[pre],m+1,r,p);
    19 }
    20 int qu(int o,int pre,int l,int r,int k){
    21     int g=sum[ls[o]]-sum[ls[pre]];
    22     if(l==r)return l;
    23     int m=(l+r)/2;
    24     if(k<=g)return qu(ls[o],ls[pre],l,m,k);
    25     return qu(rs[o],rs[pre],m+1,r,k-g);
    26 }
    27 int h=1e5+5;
    28 int main(){
    29     scanf("%d%d",&n,&q);
    30     for(int i=1;i<=n;i++){
    31         scanf("%d",&a[i]);
    32         b[i]=a[i];
    33     }
    34     sort(b+1,b+1+n);
    35     for(int i=1;i<=n;i++){
    36         a[i]=lower_bound(b+1,b+1+n,a[i])-b;
    37     }
    38     for(int i=1;i<=n;i++){
    39         up(rt[i],rt[i-1],1,h,a[i]);
    40     }
    41     while(q--){
    42         int ql,qr,k;
    43         scanf("%d%d%d",&ql,&qr,&k);
    44         int id=qu(rt[qr],rt[ql-1],1,h,k);
    45         printf("%d
    ",b[id]);
    46     }
    47 }
    48 /*
    49 7 3
    50 1 5 2 6 3 7 4
    51 2 5 3
    52 4 4 1
    53 1 7 3
    54 */
  • 相关阅读:
    lightoj1140_数位dp
    lightoj1057_状压dp
    lightoj1068_数位dp
    lightoj1018_状压dp
    lightoj1217_简单dp
    lightoj1119_简单状压dp
    lightoj1037_状压dp
    lightoj1110_LCS并输出
    图论算法----最短路
    poj1182 食物链
  • 原文地址:https://www.cnblogs.com/ccsu-kid/p/11305599.html
Copyright © 2011-2022 走看看