• hdu 4006 Treap


    继续测模板...

      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdlib>
      4 #include <cstdio>
      5 #include <ctime>
      6 using namespace std;
      7 
      8 struct Node 
      9 {
     10     Node * ch[2];
     11     int v, r, size, cnt;
     12     int cmp( int x )
     13     {
     14         if ( x == v ) return -1;
     15         return x < v ? 0 : 1;
     16     }    
     17     void maintain()
     18     {
     19         size = cnt;
     20         if ( ch[0] != NULL ) size += ch[0]->size;
     21         if ( ch[1] != NULL ) size += ch[1]->size;
     22     }
     23 };
     24 
     25 void rotate( Node * & o, int d )
     26 {
     27     Node * k = o->ch[d ^ 1];
     28     o->ch[d ^ 1] = k->ch[d];
     29     k->ch[d] = o;
     30     o->maintain();
     31     k->maintain();
     32     o = k;
     33 }
     34 
     35 void insert( Node * & o, int x )
     36 {
     37     if ( o == NULL )
     38     {
     39         o = new Node();
     40         o->ch[0] = o->ch[1] = NULL;
     41         o->v = x;
     42         o->r = rand();
     43         o->size = o->cnt = 1;
     44     }
     45     else
     46     {
     47         int d = o->cmp(x);
     48         if ( d == -1 )
     49         {
     50             o->cnt++;
     51             o->size++;
     52         }
     53         else
     54         {
     55             insert( o->ch[d], x );
     56             if ( o->ch[d]->r > o->r )
     57             {
     58                 rotate( o, d ^ 1 );
     59             }
     60             else
     61             {
     62                 o->maintain();
     63             }
     64         }
     65     }
     66 }
     67 
     68 int kth( Node * o, int k )
     69 {
     70     int tmp = ( o->ch[0] == NULL ? 0 : o->ch[0]->size );
     71     if ( k >= tmp + 1 && k <= tmp + o->cnt ) return o->v;
     72     else if ( k < tmp + 1 ) return kth( o->ch[0], k );
     73     else return kth( o->ch[1], k - tmp - o->cnt );
     74 }
     75 
     76 void clear( Node * o )
     77 {
     78     if ( o == NULL ) return ;
     79     clear( o->ch[0] );
     80     clear( o->ch[1] );
     81     delete o;
     82 }
     83 
     84 int main ()
     85 {
     86     int n, k;
     87     while ( scanf("%d%d", &n, &k) != EOF )    
     88     {
     89         Node * root = NULL;
     90         char op[2];
     91         for ( int i = 0; i < n; i++ )
     92         {
     93             scanf("%s", op);
     94             if ( op[0] == 'I' )
     95             {
     96                 int tmp;
     97                 scanf("%d", &tmp);
     98                 insert( root, tmp );
     99             }
    100             else
    101             {
    102                 printf("%d
    ", kth( root, root->size + 1 - k ));
    103             }
    104         }
    105         clear(root);
    106         root = NULL;
    107     }
    108     return 0;
    109 }
  • 相关阅读:
    Docker
    Dotted lines by default in ViVA
    8245H(C2)光猫配置方法
    两种将verilog网表转为spice网表的方法
    calibredrv create reference cell
    怎么flatten一个GDS所有层次
    路由器后面访问光猫
    贝尔IPTV
    PDK导出的cdl MOS四端顺序不正确
    如何删除已经存在lib的techfile
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4695924.html
Copyright © 2020-2023  润新知