break VS 平衡树

 

圆锥玩具

问题描述

xqz小朋友家中堆积了好多好多种玩具,其中一种便是圆锥玩具。他经常将这类玩具混乱的摆在地上,欣赏内在的排列美。

他先把圆锥垂直放在地面上。这些圆锥都有一个特点,就是它的半径等于高度,且内部是空心的,底面也是空的。xqz小朋友有时会将其中的一些小的圆锥玩具放到比它大的圆锥玩具里,如果一个圆锥玩具不被另外任意一个圆锥完全包裹着,xqz就会格外喜欢它(…)

你的任务便是帮助xqz小朋友找出所有他格外喜欢的玩具。(特别的,如果两个圆锥的底面相切,小的圆锥也算被包裹着)为了简化模型,我们将地面抽象成二维平面

输入文件

第一行一个正整数N,表示玩具个数。

接下来N行,每行3个实数,rixiyi,表示圆锥底面的半径和坐标。(其中hi=rihi表示圆锥的高度),第i行为第i个玩具。

输入数据仅保证任意两个圆锥的底面不相交且不重合,不保证不相切。

输出文件

第一行一个数M,表示xqz格外喜欢的玩具的个数。

第二行M个数,输出玩具的编号,从小到大输出,以空格隔开。

输入样例

5

1 0 -2

3 0 3

10 0 0

1 0 1.5

10 50 50

输出样例

2

3 5

数据规模和约定

       对于20%的数据,N≤ 500

       对于100%的数据,N ≤ 100000-109 rixiyi≤109ri为正数。

 

 

今天上午考了一道伪计算几何题,实际是平衡树维护区间,但高一一位神人刘政宁写了个暴力+端点排序+端点判断break

0.5s(只最大数据) VS 平衡树0.55s (全部的数据每个点) 难能可贵的是改了数据还是比标程快!!!!!!

 

 

我改进了一下,加了索引数组,省去了二次排序(最大点0.3s)

标程(平衡树):

 

 

陈文潇的blog:http://blog.youkuaiyun.com/chenwenxiaocom/archive/2011/05/20/6434738.aspx

### 平衡二叉排序树中的节点删除算法 在平衡二叉排序树(如红黑树或AVL树)中,删除操作不仅涉及移除目标节点,还需要保持树的自平衡特性。以下是通用的删除过程: #### 删除节点的一般流程 当要删除一个节点时,存在三种情况: - **叶子节点**:如果该节点既无左子也无右子,则可以直接将其从父节点指向它的指针置为空。 - **只有一个孩子节点的情况**:此时可以将此单孩子的节点替换为目标节点的位置,并更新相应的父子关系。 - **有两个孩子节点的情况**:找到待删节点的前驱或后继节点来替代它;通常选择的是最小右子树上的最大值作为继承者。 对于最后一种情形,在完成上述调整之后还需执行一次标准旋转动作以恢复整棵树的高度平衡属性[^1]。 #### 红黑树的具体实现细节 针对红黑树而言,除了遵循以上原则外,还应特别注意维持其特有的性质——即任何路径上黑色结点数目相等以及根到叶不存在连续两个红色结点。因此,在实际编程实践中可能会涉及到额外的颜色翻转和多次重定向链接的操作以便于重新校准这些约束条件[^4]。 ```python def rb_delete(T, z): y = z y_original_color = y.color if not z.left: x = z.right transplant(T, z, z.right) elif not z.right: x = z.left transplant(T, z, z.left) else: y = tree_minimum(z.right) y_original_color = y.color x = y.right if y.parent == z: x.parent = y else: transplant(T, y, y.right) y.right = z.right y.right.parent = y transplant(T, z, y) y.left = z.left y.left.parent = y y.color = z.color if y_original_color == 'black': fixup_rb_deletion(T, x) def fixup_rb_deletion(T, x): while x != T.root and color(x) == "BLACK": if x == left(parent(x)): w = right(parent(x)) if color(w) == RED: set_black(w) set_red(parent(x)) rotate_left(T, parent(x)) w = right(parent(x)) if color(left(w)) == BLACK and \ color(right(w)) == BLACK: set_red(w) x = parent(x) else: if color(right(w)) == BLACK: set_black(left(w)) set_red(w) rotate_right(T, w) w = right(parent(x)) copy_color(w, parent(x)) set_black(right(w)) rotate_left(T, parent(x)) break else: # symmetric case for when x is the right child ... set_black(x) ``` 这段代码展示了红黑树删除过程中的一部分逻辑,包括基本框架下的`rb_delete()`函数及其辅助修复方法`fixup_rb_deletion()`。通过这种方式可以在不影响整体结构稳定性的前提下安全地移除指定元素并确保其余部分依旧满足定义好的规则体系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值