zoukankan      html  css  js  c++  java
  • SPOJ3273 Order statistic set treap模板

    题目链接:http://www.spoj.com/problems/ORDERSET/

    题意:给你四个操作,将x插入节点,将值为x的节点删除,找第K大的节点,找值为X的节点是第几大

    解题思路:treap树性质,copy了 clj 在 nocow 上的模板,利用 指针引用,孩子数组来简化代码

    解题代码:

      1 // File Name: treap.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年07月22日 星期二 09时06分23秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 using namespace std;
     25 
     26 const int inf = ~0U>>1;
     27 class treap
     28 {
     29    struct node{
     30      int value , key ,size;
     31      node(int v, node *n):value(v)
     32      {c[0] = c[1]= n; size = 1; key = rand()-1;}
     33      void rz(){size =c[0]->size + c[1]->size+1;}
     34      node*c[2];
     35    }*root,*null;
     36    void rot(node *&t,bool d)
     37    {
     38        node *c = t->c[d];
     39        t->c[d] = c->c[!d];
     40        c->c[!d] = t; 
     41        t->rz();c->rz();
     42        t = c;
     43    }
     44    void insert(node *&t,int x)
     45    {
     46        if(t == null)
     47        {
     48          t = new node(x,null);
     49          return ; 
     50        }
     51        if(x == t->value) return;
     52        bool d = x > t->value;
     53        insert(t->c[d],x);
     54        if(t->c[d]->key < t->key) //把小的随机值移动到上面
     55           rot(t,d);
     56        else t->rz();
     57    }
     58    void Delete(node *&t,int x)
     59    {
     60       if(t == null) return;
     61       if(t->value == x)  //將这个值一直旋转到叶子节点然后删除
     62       {
     63           bool d = t->c[1]->key < t->c[0]->key;
     64           if(t->c[d] == null)
     65           {
     66               delete t;
     67               t = null;
     68               return ;
     69           }
     70           rot(t,d);
     71           Delete(t->c[!d],x);
     72       }
     73       else{
     74         bool d = x>t->value;
     75         Delete(t->c[d],x);
     76       }
     77       t->rz();
     78    }
     79    int select(node *t ,int k )
     80    {
     81       int r = t->c[0]->size;
     82       if(k ==  r)
     83          return t->value;
     84       if(k < r) return select(t->c[0],k);
     85       return select(t->c[1], k - r - 1);
     86    }
     87    int rank(node *t , int x)
     88    {
     89        if(t == null) return 0 ; 
     90        int r = t->c[0]->size;
     91        if(x == t->value)
     92            return r;
     93        if(x < t->value)  return rank(t->c[0],x);
     94        return r+1+rank(t->c[1],x);
     95    }
     96    public:
     97       treap()
     98       {
     99         null = new node(0,0);
    100         null ->size = 0 ;
    101         null ->key = inf;
    102         root = null;
    103       }
    104       void ins(int x)
    105       {
    106         insert(root,x);
    107       }
    108       int sel(int k)
    109       {
    110         if(k > root->size) return -inf;
    111         return select(root,k-1);
    112       }
    113       int ran(int x)
    114       {
    115         return rank(root,x);
    116       }
    117       void del(int x)
    118       {
    119          Delete(root,x);
    120       }
    121 }T;
    122 int main(){
    123     //printf("%d
    ",inf);   
    124       //freopen("in","r",stdin);
    125     int m;scanf("%d
    ",&m);    
    126     char t;int x,tmp;
    127     while(m--)
    128     {
    129         scanf("%c %d
    ",&t,&x);
    130         switch(t)
    131         {
    132             case 'I':T.ins(x);break;
    133             case 'D':T.del(x);break;
    134             case 'K':tmp=T.sel(x);if(tmp==-inf)printf("invalid
    ");else printf("%d
    ",tmp);break;
    135             case 'C':printf("%d
    ",T.ran(x));break;
    136         }        
    137     }
    138 return 0;
    139 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    到具体某一天的倒计时
    angular2 2种方式----获取子组件的类属性和类方法
    页面刷新
    angular父子组件传值
    div垂直居中,文字垂直居中!!!
    Python 基础数据类型 II (列表)
    Python 基础数据类型 I (str等)
    学习笔记411
    20190407 Word合并单元格
    VBA正则笔记 理解肯定环视
  • 原文地址:https://www.cnblogs.com/zyue/p/3859961.html
Copyright © 2011-2022 走看看