今晚,终于自己把treap的实现写了一遍,感觉不错。加油。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstdlib>
  4 #define rep(i,j,k) for(int i = j; i <= k; i++ )
  5 using namespace std;
  6 int n = 0;
  7
  8 int read()
  9 {
 10     int s = 0, t = 1;
 11     char c = getchar();
 12     while( !isdigit(c) ){
 13         if( c == ‘-‘ ) t = -1;
 14         c = getchar();
 15     }
 16     while( isdigit(c) ){
 17         s = s * 10 + c - ‘0‘;
 18         c = getchar();
 19     }
 20     return s * t;
 21 }
 22
 23 struct node{
 24 node*ch[2];
 25 int size, key, r;
 26 node(int key):key(key){
 27     ch[0] = NULL, ch[1] = NULL, r = rand(),size = 1;
 28   }
 29 int cmp(int x) const{
 30     if( x == key ) return -1;
 31     return x < key ? 0 : 1;
 32   }
 33 void maintain() {
 34   size = 1;
 35   if( ch[0] != NULL ) size += ch[0] -> size;
 36   if( ch[1] != NULL ) size += ch[1] -> size;
 37 }
 38
 39 };
 40
 41 void rorate(node*& o,int d)
 42 {
 43     node*k = o->ch[d^1];
 44     o->ch[d^1] = k->ch[d];
 45     k->ch[d] = o;
 46     o->maintain();
 47     k->maintain();
 48     o = k;
 49 }
 50
 51 void insert(node*&u,int v)
 52 {
 53     if( u == NULL ){
 54         u = new node(v);
 55     }
 56     else {
 57         int d = u->cmp(v);
 58         insert(u->ch[d], v);
 59         if( u->ch[d]->r > u->r ){
 60             rorate(u,d^1);
 61         }
 62     }
 63     u->maintain();
 64 }
 65
 66 void remove(node*&u,int v)
 67 {
 68     if( u == NULL ) return;
 69     int d = u->cmp(v);
 70     if( d == -1){
 71         if( u->ch[0] == NULL ){
 72             u = u->ch[1];
 73         }
 74         else if( u->ch[1] == NULL ){
 75             u = u->ch[0];
 76         }
 77         else {
 78             int d2 = (u->ch[0]->r > u->ch[1]->r ? 1 : 0);
 79             rorate(u,d2);
 80             remove(u->ch[d2],v);
 81         }
 82     }
 83     else remove(u->ch[d],v);
 84     if( u != NULL ) u->maintain();
 85 }
 86
 87 bool infind(node*&u,int v)
 88 {
 89     while( u != NULL )
 90     {
 91         int d = u->cmp(v);
 92         if( d == -1 )return 1;
 93         u = u->ch[d];
 94     }
 95     return 0;
 96 }
 97
 98 node* find(node*u,int v)
 99 {
100     while( u != NULL )
101     {
102         int d = u->cmp(v);
103         if( d == -1 )return u;
104         u = u->ch[d];
105     }
106     return NULL;
107 }
108
109 int kth(node*& u,int k)
110 {
111     if( u == NULL|| k <= 0 || k > u->size ) return 0;
112     int d = u->ch[1] == NULL? 0 : u->ch[1]->size;
113     if( k == d+1 ) return u->key;
114     else {
115         if( d >= k ){
116             return kth(u->ch[1],k);
117         }
118         else return kth(u->ch[0],k-d-1);
119     }
120 }
121
122 int rfind(node*u,int x)
123 {
124     int z = 0;
125     while( u != NULL )
126     {
127         int d = u->cmp(x);
128         if( d == -1 )
129            return z + ( u->ch[1] == NULL ? 1 : u->ch[1]->size+1 );
130         if( d == 0) z += (u->ch[1] == NULL ? 1 : u->ch[1]->size+1);
131         u = u->ch[d];
132     }
133     if( u == NULL ) return 0;
134 }
135
136 int rank(node*&u,int x)
137 {
138     int k = rfind(u,x);
139     return k;
140 }
141
142 int pre(node*u,int x)
143 {
144     int t = rank(u,x);
145     if( !t ) return 0;
146     return kth(u,t+1);
147 }
148
149 int suc(node*&u,int x)
150 {
151     int t = rank(u,x);
152     if( !t ) return 0;
153     return kth(u,t-1);
154 }
155
156 int minl(node*&u)
157 {
158     return kth(u,n);
159 }
160
161 int maxl(node*&u)
162 {
163     return kth(u,1);
164 }
165
166 void print(node* u)
167 {
168     if( u->ch[0] != NULL ){
169         print(u->ch[0]);
170     }
171     cout<<u->key<<" ";
172     if( u->ch[1] != NULL ){
173         print(u->ch[1]);
174     }
175 }
176
177 int main()
178 {
179     node* root = NULL;
180      int x;
181      while( scanf("%d", &x) == 1 && x ){
182         insert(root,x);
183         n++;
184      }
185      cout<<n<<endl;
186     char c;
187     while( scanf("%c", &c) == 1 ){
188         if( c == ‘d‘ ){
189             int x = read();
190             remove(root,x);
191             n--;
192         }
193         else if( c == ‘k‘ ){
194             int x = read();
195             cout<<kth(root,x)<<endl;
196         }
197         else if( c == ‘r‘ ){
198             int x = read();
199             cout<<rank(root,x)<<endl;
200         }
201         else if( c == ‘p‘ ){
202             int x = read();
203             cout<<pre(root,x)<<endl;
204         }
205         else if( c == ‘s‘ ){
206             int x = read();
207             cout<<suc(root,x)<<endl;
208         }
209         else if( c == ‘m‘){
210             cout<<maxl(root)<<endl;
211         }
212         else if( c == ‘n‘ ){
213             cout<<minl(root)<<endl;
214         }
215         print(root);
216         cout<<endl<<endl;
217     }
218     return 0;
219 }
时间: 2024-11-06 18:06:14

今晚,终于自己把treap的实现写了一遍,感觉不错。加油。的相关文章

poj3616题(动态规划),看了别人的提示,自己又写了一遍

http://blog.csdn.net/xiaozhuaixifu/article/details/10818657参考文档链接 动态规划的主要三种思维方式:递推(从前往后想),状态转移(从后往前想),记忆化搜索(记录之后直接查寻).这里使用状态转移的思维解题,明确除了没有移动这种情况,每次接受到或接受不到的位置可以由移位或不移位两种情况转移而来,到了该位置后根据原始数据直接加或不加总和. #include <stdio.h> #include <stdlib.h> #inclu

2003年写的程序界面还不错嘛

我在2003年写的 JiurlPebSee 的界面,感觉还不错嘛. 今天试个东西,想看一个程序中的一个地址,是不是在某个堆里.但我这儿没搭调试环境.VC调试又看不了堆.结果想起当年写的 JiurlPebSee 能看(通过一个小驱动,来读取指定进程的指定地址中的内容).试了一下,当年是针对win 2k写的,win xp下功能已经无法完成了.但感觉界面还不错嘛. 我的微博:http://weibo.com/ddqqppb

看到一篇写的关于block和delegate放在一起来方便大家理解的文章,感觉不错,就推荐给大家来看一下。

代理设计模式对于iOS开发的人来说肯定很熟悉了,代理delegate就是委托另一个对象来帮忙完成一件事情,为什么要委托别人来做呢,这其实是MVC设计模式中的模块分工问题,例如View对象它只负责显示界面,而不需要进行数据的管理,数据的管理和逻辑是Controller的责任,所以此时View就应该将这个功能委托给Controller去实现,当然你作为码农强行让View处理数据逻辑的任务,也不是不行,只是这就违背了MVC设计模式,项目小还好,随着功能的扩展,我们就会发现越写越难写:还有一种情况,就是

Redux-react connect 的源码从新写了一遍

import Counter from '../components/Counter'; import { increment, decrement, incrementIfOdd, incrementAsync } from '../actions'; import { bindActionCreators } from 'redux'; import React, { Component, createElement } from 'react'; import PropTypes from

雷军语录:写程序有写诗一样的感觉

01 只有真正喜欢才能写好程序 喜欢写程序,做程序员就是上天堂: 不喜欢写程序,做程序员就是下地狱. --雷军 程序员需要整天趴在电脑前,经常没日没夜的,非常辛苦,而且工作来不得半点虚假,少写一个标点符号都不行.喜欢的人,日子过得非常开心,每写一行代码,都会有新的成就,尤其当自己的作品被广泛应用的时候,那种自豪感油然而起.不喜欢的人,坐在电脑前极端无聊,被进度压得喘不过气来,天天为找bug改bug生气. 02 把程序当艺术品,象写诗一样来写代码 如果每个人写程序的时候当艺术品来写,写每行都认认真

自己写的一个SqlHelper,感觉使用起来挺方便的

using System; using System.Data; using System.Collections.Generic; using System.Configuration; using System.Text; using System.IO; using System.Data.SqlClient; namespace NdfDeviceNetC { /// <summary> /// Oracle数据库操作类 /// </summary> public clas

关于PHP魔术方法__call的一点小发现

好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方法会在特定情况下被触发,我们也可以对其进行重写. ---------------------------------------------------------------------------------------------------------摘抄开始----------------

CSS 关键的基础知识

今晚看了 百度传课 一门关于CSS的课程, 感觉不错, 随手记了点儿笔记, 供以后查阅. =================================================== position:relative: 相对于自己原来的位置(正常文档流中的位置), 特点:原来的位置不会消失, 可以和float, center等属性一起使用.absolute: 相对于距离自己最近的有position属性的祖宗节点(如果不存在这样的祖宗, 则相对于静态可视区域[会被淹没]--你能看见的浏

ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意事项

引言: 本人想自己个博客网站出来,技术路线是用ASN.NET MVC5+EF6(Code First)+ZUI+各种Jquery插件,有了这个想法之后就开始选择UI,看了好多bootstrap的模板之后,发现即使你用了bootstrap还是要自己写css样式,都是自学的,前端真的很垃圾,在网上找了很多UI,以下是各种UI的地址,需要的可以去看看: H-ui:http://www.h-ui.net/H-ui.admin.shtml ,是一个前端大牛弄得,模仿bootstrap,做适合中国网上的UI