T, Compare, Tag,
Allocator> // 由于 OI
// 中很少出现空间配置器,故这里不做讲解(其实是我也不知道是啥,逃
- /*
- * T : 储存的元素类型
- * Compare : 提供严格的弱序比较类型
- * Tag : 是__gnu_pbds提供的不同的五种堆,Tag参数默认是
- * pairing_heap_tag 五种分别是 : pairing_heap_tag -> 配对堆
- * // 官方文档认为在非原生元素(如自定义结构体/ std :: string
- * / pair)中 pairing heap 表现的最好 binary_heap_tag ->
- * 二叉堆 // 官方文档认为在原生元素中
- * 二叉堆表现最好,不过我测试的表现并没有那么好
- * binomial_heap_tag -> 二项堆 //
- * 二项堆在合并操作的表现要优于配对堆* 但是其取堆顶元素的
- * rc_binomial_heap_tag -> 冗余计数二项堆
- * thin_heap_tag -> 除了合并的复杂度都和 Fibonacci
- * 堆一样的一个 tag
- * 由于本篇文章只是提供给学习算法竞赛的同学们,故对于后四个
- * tag 只会简单的介绍复杂度,第一个会介绍成员函数和
- * 使用方法,经作者本机 Core i5@3.1 GHz On macOS
- * 测试堆的基础操作/结合 GNU 官方的复杂度测试/Dijkstra
- * 测试,都表明至少对于*** OIer
- * ***来讲,除了配对堆的其他4个tag都是鸡肋,不是没什么用就是常数大到不如
- * std 的 且有可能造成 MLE
- * priority_queue,故这里只推荐用默认的 pairing_heap。
- * 同样,配对堆也优于 algorithm 库中的 make_heap()
- */
- // 构造方式 : 要注明命名空间因为和std的类名称重复
- __gnu_pbds ::priority_queue<int>
- __gnu_pbds ::priority_queue<int, greater<int> >
- __gnu_pbds ::priority_queue<int, greater<int>,
- pairing_heap_tag>
- // 迭代器
- // :迭代器是一个内存地址,在modify和push的时候都会返回一个迭代器,下文会详细的讲使用方法
- __gnu_pbds ::priority_queue<
- int>::point_iterator id;
+ /*
+ * T : 储存的元素类型
+ * Compare : 提供严格的弱序比较类型
+ * Tag : 是__gnu_pbds提供的不同的五种堆,Tag参数默认是
+ * pairing_heap_tag 五种分别是 : pairing_heap_tag -> 配对堆
+ * // 官方文档认为在非原生元素(如自定义结构体/ std :: string
+ * / pair)中 pairing heap 表现的最好 binary_heap_tag ->
+ * 二叉堆 // 官方文档认为在原生元素中
+ * 二叉堆表现最好,不过我测试的表现并没有那么好
+ * binomial_heap_tag -> 二项堆 //
+ * 二项堆在合并操作的表现要优于配对堆* 但是其取堆顶元素的
+ * rc_binomial_heap_tag -> 冗余计数二项堆
+ * thin_heap_tag -> 除了合并的复杂度都和 Fibonacci
+ * 堆一样的一个 tag
+ * 由于本篇文章只是提供给学习算法竞赛的同学们,故对于后四个
+ * tag 只会简单的介绍复杂度,第一个会介绍成员函数和
+ * 使用方法,经作者本机 Core i5@3.1 GHz On macOS
+ * 测试堆的基础操作/结合 GNU 官方的复杂度测试/Dijkstra
+ * 测试,都表明至少对于*** OIer
+ * ***来讲,除了配对堆的其他4个tag都是鸡肋,不是没什么用就是常数大到不如
+ * std 的 且有可能造成 MLE
+ * priority_queue,故这里只推荐用默认的 pairing_heap。
+ * 同样,配对堆也优于 algorithm 库中的 make_heap()
+ */
+ // 构造方式 : 要注明命名空间因为和std的类名称重复
+ __gnu_pbds ::priority_queue<int> __gnu_pbds ::priority_queue<int,
+ greater<int> >
+ __gnu_pbds ::priority_queue<int, greater<int>, pairing_heap_tag>
+ // 迭代器
+ // :迭代器是一个内存地址,在modify和push的时候都会返回一个迭代器,下文会详细的讲使用方法
+ __gnu_pbds ::priority_queue<int>::point_iterator id;
id = q.push(1);
```
当前节点表示的区间 t, 当前访问的节点编号 p) {
如果(l <= s&& t <= r) // 当前访问的节点表示的区间包含在查询区间内
{返回 d[p] ;} 否则 {
- 令 返回值 = 0 如果(l <= (s + t) / 2) // 当前访问的节点的左儿子节点表示的区间包含在查
- // 询区间内,(s+t)/2
- // 其实是左右儿子节点表示的区间的分割线且(s+t)/2
- // 包含在左儿子节点表示的区间中
+ 令 返回值 = 0 如果(l <=
+ (s + t) / 2) // 当前访问的节点的左儿子节点表示的区间包含在查
+ // 询区间内,(s+t)/2
+ // 其实是左右儿子节点表示的区间的分割线且(s+t)/2
+ // 包含在左儿子节点表示的区间中
{
返回值 += 求和(l, r, s, (s + t) / 2,
p * 2); // l 和 r