Splay BUG版 = =

  1 struct splay_node {
  2     splay_node *left, *right;
  3     int value;
  4 };
  5 int size;
  6
  7 splay_node* splay(splay_node* a, int v) {
  8     splay_node b, *l, *r, *y;
  9     if(a == NULL) return a;
 10     b.left = b.right = NULL;
 11     l = r = &b;
 12     while(1) {
 13         if(v < a->value) {
 14             if(a->left == NULL) {
 15                 break;
 16             }
 17             if(v < a->left->value) {
 18                 y = a->left;
 19                 a->left = y->right;
 20                 y->right = a;
 21                 a = y;
 22                 if(a->left == NULL) {
 23                     break;
 24                 }
 25             }
 26             r->left = a;
 27             r = a;
 28             a = a->left;
 29         } else if(v > a->value) {
 30             if(a->right == NULL) {
 31                 break;
 32             }
 33             if(v > a->right->value) {
 34                 y = a->right;
 35                 a->right = y->left;
 36                 y->left = a;
 37                 a = y;
 38                 if(a->right == NULL) {
 39                     break;
 40                 }
 41             }
 42             l->right = a;
 43             l = a;
 44             a = a->right;
 45         } else {
 46             break;
 47         }
 48     }
 49     l->right = a->left;
 50     r->left = a->right;
 51     a->left = b.right;
 52     a->right = b.left;
 53     return a;
 54 }
 55
 56 splay_node* splay_insert(splay_node* a, int v) {
 57     splay_node *node = new splay_node;
 58     node->value = v;
 59     if(a == NULL) {
 60         node->left = node->right = NULL;
 61         size = 1;
 62         return node;
 63     }
 64     a = splay(a, v);
 65     if(v < a->value) {
 66         node->left = a->left;
 67         node->right = a;
 68         a->left = NULL;
 69         size++;
 70         return node;
 71     } else if(v > a->value) {
 72         node->right = a->right;
 73         node->left = a;
 74         a->right = NULL;
 75         size++;
 76         return node;
 77     } else {
 78         delete node;
 79         return a;
 80     }
 81 }
 82
 83 int splay_getmin(splay_node* a) {
 84     if(a->left == NULL) return a->value;
 85     return splay_getmin(a->left);
 86 }
 87
 88 int splay_getmax(splay_node* a) {
 89     if(a->right == NULL) return a->value;
 90     return splay_getmin(a->right);
 91 }
 92
 93 splay_node* splay_delete(splay_node* a, int v) {
 94     splay_node* x;
 95     if(a == NULL) {
 96         return NULL;
 97     }
 98     a = splay(a, v);
 99     if(v == a->value) {
100         if(a->left == NULL) {
101             x = a->right;
102         } else {
103             x = splay(a->left, splay_getmax(a->left));
104             x->right = a->right;
105         }
106         size--;
107         delete a;
108         return x;
109     }
110     return a;
111 }
时间: 2024-11-02 15:53:36

Splay BUG版 = =的相关文章

GridCtrl学习笔记(3)一行一行地更新表格,有bug版

代码: 运行结果: 在鼠标不去点.使用滚动条的时候,程序运行正常,一行一行地更新: Bug说明: 1.更新的时候,如果格子有一小块已经显示出来,滚动条不会动: 2.鼠标点击滚动条后,程序运行会有问题 提示错误的地方: intCGridCtrl::GetRowHeight(int nRow)const { ASSERT(nRow >=0&& nRow < m_nRows); if(nRow <0|| nRow >= m_nRows) return-1; return

Splay普及版

辣么,我要介绍我自学的\(Splay\)了,虽然跟大佬们讲得会有些重复,但是自认为把一些玄妙的东西点出来了\(qwq\) 引言 首先,我并没觉得\(Splay\)有多难--代码长的原因也就最多是因为不用指针太麻烦--就好像你链表不用指针而用数组模拟,在插入删除的时候就有你好受的了\(qnq\),更何况树形结构更为麻烦,在树上的操作也更加花样繁多.总之,麻烦. 但是\(Splay\)在我眼中却更像是一种可以放诸四海而皆可用的算法,不但可以有效替代二叉搜索树.\(AVL\)树等数据结构,也不会由于\

POJ 3468 A Simple Problem with Integers splay

题意:给你一个数列,区间更新和区间询问 解题思路:splay指针版撸的,4700 ms险过 解题代码: 1 // File Name: spoj3468.cpp 2 // Author: darkdream 3 // Created Time: 2014年11月05日 星期三 19时40分26秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include&l

刷题总结——二逼平衡树(bzoj3224线段树套splay)

题目: Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查询k在区间内的后继(后继定义为大于x,且最小的数) Input 第一行两个数 n,m 表示长度为n的有序序列和m个操作第二行有n个数,表示有序序列下面有m行,opt表示操作标号若opt=1 则为操作1,之后有三个数l,r,k 表示查询k在区间[l,r

Java多线程:生产者消费者更佳的解决方法(确定不会出现死锁)

今天看了一片博文,讲Java多线程之线程的协作,其中作者用程序实例说明了生产者和消费者问题,但我及其他读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的例子也都存在bug,经过仔细研究发现其中的问题,并解决了,感觉有意义贴出来分享下. 下面首先贴出的是有bug的代码,一个4个类,Plate.java: package CreatorAndConsumer; import java.util.ArrayList; import java.util.List; /** * 盘子,表示共享的资源

Java多线程之生产者消费者问题&amp;lt;一&amp;gt;:使用synchronized keyword解决生产者消费者问题

今天看了一片博文,讲Java多线程之线程的协作,当中作者用程序实例说明了生产者和消费者问题,但我及其它读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的样例也都存在bug,经过细致研究发现当中的问题.并攻克了,感觉有意义贴出来分享下. 以下首先贴出的是有bug的代码,一个4个类.Plate.java: package CreatorAndConsumer; import java.util.ArrayList; import java.util.List; /** * 盘子,表示共享的资源

BZOJ 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树

之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池..尼玛终于过了..附zju2112代码于后. bzoj倒是过了,1A的感觉还是很爽的..可是时间不好看..这就是所谓\(O(nlog^3n)\)的复杂度的可怜之处么? 写挂的地方: insert一定要是传地址指针进去. delete时先把地址指针delete掉,最后把是地址指针指向左儿子or右儿子

浅析Python多线程

今天看了几篇博客,主要讲解线程的实例以及如何避免线程间的竞争,觉得感觉对自己很有用,所以在此先写先来以备以后自己查阅. 实例一:我们将要请求三个不同的url 1.单线程: 1 import time 2 from urllib.request import urlopen 3 4 5 def get_responses(): 6 urls = [ 7 'http://www.baidu.com', 8 'http://www.taobao.com', 9 'http://www.alibaba.

06-动画封装

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> .box1 { margin: 0; padding: 5px; height: 200px; background-color: #ddd; position: relative; } button { mar