zoukankan      html  css  js  c++  java
  • HDU 4006 The kth great number

    HDU_4006

        为了练一下昨天刚学的SBT,所以就用SBT写了,但实际上这个题目只需要维护一个只有k个元素的最小堆即可,每次查询就输出堆顶的元素,如果insert的元素比堆顶元素大,就把堆顶元素删掉,然后把这个insert的元素插入到堆中。

    #include<stdio.h>
    #include<string.h>
    #define MAXD 1000010
    int N, K, T, left[MAXD], right[MAXD], node, key[MAXD], size[MAXD];
    void left_rotate(int &T)
    {
    int k = right[T];
    right[T] = left[k];
    left[k] = T;
    size[k] = size[T];
    size[T] = size[left[T]] + size[right[T]] + 1;
    T = k;
    }
    void right_rotate(int &T)
    {
    int k = left[T];
    left[T] = right[k];
    right[k] = T;
    size[k] = size[T];
    size[T] = size[left[T]] + size[right[T]] + 1;
    T = k;
    }
    void maintain(int &T, int flag)
    {
    if(flag == 0)
    {
    if(size[left[left[T]]] > size[right[T]])
    right_rotate(T);
    else if(size[right[left[T]]] > size[right[T]])
    left_rotate(left[T]), right_rotate(T);
    else
    return ;
    }
    else
    {
    if(size[right[right[T]]] > size[left[T]])
    left_rotate(T);
    else if(size[left[right[T]]] > size[left[T]])
    right_rotate(right[T]), left_rotate(T);
    else
    return ;
    }
    maintain(left[T], 0);
    maintain(right[T], 1);
    maintain(T, 0);
    maintain(T, 1);
    }
    void add(int &T, int v)
    {
    T = ++ node;
    key[T] = v;
    size[T] = 1;
    left[T] = right[T] = 0;
    }
    void Insert(int &T, int v)
    {
    if(T == 0)
    {
    add(T, v);
    return ;
    }
    ++ size[T];
    if(v < key[T])
    Insert(left[T], v);
    else
    Insert(right[T], v);
    maintain(T, v >= key[T]);
    }
    int select(int &T, int k)
    {
    int n = size[left[T]] + 1;
    if(n == k)
    return key[T];
    else if(k < n)
    return select(left[T], k);
    else
    return select(right[T], k - n);
    }
    void solve()
    {
    int i, j, k;
    char b[5];
    T = node = left[0] = right[0] = size[0] = 0;
    for(i = 0; i < N; i ++)
    {
    scanf("%s", b);
    if(b[0] == 'I')
    {
    scanf("%d", &k);
    Insert(T, k);
    }
    else
    printf("%d\n", select(T, size[T] - K + 1));
    }
    }
    int main()
    {
    while(scanf("%d%d", &N, &K) == 2)
    {
    solve();
    }
    return 0;
    }


  • 相关阅读:
    简便的将DataSet导入到数据库中
    数据类型的小小研究:Access与SQL Server的数据类型
    【jxust acm 20120708】
    【D ECJTU_ACM 11级队员2012年暑假训练赛(2)】
    【hdu 2101 A + B Problem Too】
    【hdu 1014】
    【hdu 1164 Eddy's research I】
    【开始,安全编程】
    【hdu 1285 确定比赛名次】
    【hdu 1163 Eddy's digital Roots 】
  • 原文地址:https://www.cnblogs.com/staginner/p/2407656.html
Copyright © 2011-2022 走看看