zoukankan      html  css  js  c++  java
  • POJ1442-查询第K大-Treap模板题

    模板题,以后要学splay,大概看一下treap就好了。

      1 #include <cstdio>
      2 #include <algorithm>
      3 #include <cstring>
      4 
      5 using namespace std;
      6 
      7 const int maxn = 3e5+10;
      8 int num[maxn],st[maxn];
      9 
     10 struct Treap{
     11     int size;
     12     int key,fix;
     13     Treap *ch[2];
     14 
     15     Treap(int key)
     16     {
     17         size = 1;
     18         fix = rand();
     19         this->key = key;
     20         ch[0] = ch[1] = NULL;
     21     }
     22     int compare(int x) const
     23     {
     24         if(x == key) return -1;
     25         return x < key ? 0 : 1;
     26     }
     27     void Maintain()
     28     {
     29         size = 1;
     30         if(ch[0] != NULL) size += ch[0]->size;
     31         if(ch[1] != NULL) size += ch[1]->size;
     32     }
     33 };
     34 
     35 void Rotate(Treap* &t ,int d)
     36 {
     37     Treap *k = t->ch[d^1];
     38     t->ch[d^1] = k->ch[d];
     39     k->ch[d] = t;
     40     t->Maintain();
     41     k->Maintain();
     42     t = k;
     43 }
     44 
     45 void Insert(Treap* &t,int x)
     46 {
     47     if(t == NULL) t = new Treap(x);
     48     else
     49     {
     50         int d = x < t->key ? 0 : 1;
     51         Insert(t->ch[d],x);
     52         if(t->ch[d]->fix > t->fix)
     53             Rotate(t,d^1);
     54     }
     55     t->Maintain();
     56 }
     57 
     58 void Delete(Treap* &t,int x)
     59 {
     60     int d = t->compare(x);
     61     if(d == -1)
     62     {
     63         Treap *tmp = t;
     64         if(t->ch[0] == NULL)
     65         {
     66             t = t->ch[1];
     67             delete tmp;
     68             tmp = NULL;
     69         }
     70         else if(t->ch[1] == NULL)
     71         {
     72             t = t->ch[0];
     73             delete tmp;
     74             tmp = NULL;
     75         }
     76         else
     77         {
     78             int k = t->ch[0]->fix > t->ch[1]->fix ? 1 : 0;
     79             Rotate(t,k);
     80             Delete(t->ch[k],x);
     81         }
     82     }
     83     else Delete(t->ch[d],x);
     84     if(t!=NULL) t->Maintain();
     85 }
     86 
     87 bool Find(Treap *t,int x)
     88 {
     89     while(t != NULL)
     90     {
     91         int d = t->compare(x);
     92         if(d == -1) return true;
     93         t = t->ch[d];
     94     }
     95     return false;
     96 }
     97 
     98 int Kth(Treap *t,int k)
     99 {
    100     if(t == NULL || k <= 0 || k > t->size)
    101         return -1;
    102     if(t->ch[0] == NULL && k == 1)
    103         return t->key;
    104     if(t->ch[0] == NULL)
    105         return Kth(t->ch[1],k-1);
    106     if(t->ch[0]->size >= k)
    107         return Kth(t->ch[0],k);
    108     if(t->ch[0]->size + 1 == k)
    109         return t->key;
    110     return Kth(t->ch[1],k-1-t->ch[0]->size);
    111 }
    112 
    113 int Rank(Treap *t,int x)
    114 {
    115     int r;
    116     if(t->ch[0] == NULL) r = 0;
    117     else r = t->ch[0]->size;
    118     if(x == t->key) return r+1;
    119     if(x < t->key)
    120         return Rank(t->ch[0],x);
    121     return r+1+Rank(t->ch[1],x);
    122 }
    123 
    124 void DeleteTreap(Treap* &t)
    125 {
    126     if(t == NULL) return;
    127     if(t->ch[0] != NULL) DeleteTreap(t->ch[0]);
    128     if(t->ch[1] != NULL) DeleteTreap(t->ch[1]);
    129     delete t;
    130     t = NULL;
    131 }
    132 
    133 int save[maxn];
    134 int M,N;
    135 
    136 int main()
    137 {
    138     while(~scanf("%d%d",&M,&N))
    139     {
    140         for(int i=1;i<=M;i++)
    141             scanf("%d",&save[i]);
    142         Treap *root = NULL;
    143         int cnt = 1;
    144         for(int i=1,x;i<=N;i++)
    145         {
    146             scanf("%d",&x);
    147             for(int j = cnt;j <= x;j++)
    148                 Insert(root,save[j]);
    149             cnt = x+1;
    150             printf("%d
    ",Kth(root,i));
    151         }
    152         DeleteTreap(root);
    153     }
    154 }
  • 相关阅读:
    学习《MYSQL》课程,日期2017.4.25-2017.4.30
    Netty学习笔记
    WebSocket学习
    Class 泛型
    SAX解析与DOM解析
    HashMap和HashTable的区别
    SQL语句整理
    观察者模式学习
    状态模式学习
    策略模式学习
  • 原文地址:https://www.cnblogs.com/helica/p/5492570.html
Copyright © 2011-2022 走看看