zoukankan      html  css  js  c++  java
  • K-th Number POJ

    K-th Number

     POJ - 2104 

    第一道主席树...

    本来暑假就该学会的东西拖到了寒假orz...

    要不是看到了这个博客估计还没去学  -----链接

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <cmath>
     5 #include <algorithm>
     6 using namespace std;
     7 #define lson l, m
     8 #define rson m + 1, r
     9 const int maxn = 1e5+10;
    10 int L[maxn<<5], R[maxn<<5], sum[maxn<<5];
    11 int tot;
    12 int a[maxn], T[maxn], Hash[maxn];
    13 
    14 int build(int l, int r){
    15     int rt = (++tot);
    16     sum[rt] = 0;
    17     if(l < r){
    18         int m = (l + r) >> 1;
    19          L[rt] = build(lson);
    20          R[rt] = build(rson);
    21     }
    22     return rt;
    23 }
    24 
    25 int update(int pre, int l, int r, int x){
    26     int rt = (++tot);
    27     L[rt] = L[pre], R[rt] = R[pre], sum[rt] = sum[pre] + 1;
    28     if(l < r){
    29         int m = (l + r) >> 1;
    30         if(x <= m) L[rt] = update(L[pre], lson, x);
    31         else R[rt] = update(R[pre], rson, x);
    32     }
    33     return rt;
    34 }
    35 
    36 int query(int u, int v, int l, int r, int k){
    37     if(l >= r) return l;
    38     int m = (l + r) >> 1;
    39     int num = sum[L[v]] - sum[L[u]];
    40     if(num >= k) return query(L[u], L[v], lson, k);
    41     else return query(R[u], R[v], rson, k - num);
    42 }
    43 
    44 
    45 int main(){
    46     int n, m;
    47     while(scanf("%d %d", &n, &m) != EOF){
    48         tot = 0;
    49         for(int i = 1; i <= n; i++){
    50             scanf("%d", &a[i]);
    51             Hash[i] = a[i];
    52         }
    53         sort(Hash + 1, Hash + 1 + n);
    54         int d = unique(Hash + 1, Hash + 1 + n) - Hash - 1;
    55         T[0] = build(1, d);
    56         for(int i = 1; i <= n; i++){
    57             int x = lower_bound(Hash + 1, Hash + 1 + d, a[i]) - Hash;
    58             //cout<<"=== " <<x<<"  === 
    ";
    59             T[i] = update(T[i-1], 1, d, x);
    60         }
    61         while(m--){
    62             int l, r, k;
    63             scanf("%d %d %d", &l, &r, &k);
    64             int x = query(T[l-1], T[r], 1, d, k);
    65             printf("%d
    ", Hash[x]);
    66         }
    67     }
    68 
    69 }
    View Code

    Kth number

     HDU - 2665 

    同上~

  • 相关阅读:
    Java实现各种排序算法
    Memcached学习笔记
    S.O.L.I.D 原则
    设计模式之Bridge
    UML建模工具比较
    UML建模
    Ps经典实例教程3000例
    ps视频教程全集
    自己做到了吗?
    记事本开发Java代码注意要点
  • 原文地址:https://www.cnblogs.com/yijiull/p/8296721.html
Copyright © 2011-2022 走看看