随笔分类 -  数据结构 - 平衡树

摘要:省选前,练练板子 + 对拍. 这道题我写了 30min,然后没有任何 bug. 简单来了 10 多组数据,然后测了几个极限数据(看看会不会爆空间之类的) 结果提交上去是 60pts,最后发现题目中没有给出 a[i] 的数据范围,然后后面的点 a[i] 超级大. code: #include <bit 阅读全文
posted @ 2020-06-19 08:28 EM-LGH 阅读(166) 评论(0) 推荐(0)
摘要:显然可以直接凑左面全是左括号,右面全是右括号的情况. 然后区间翻转就用 splay 模拟好了. splay 的时候一定注意一点: 如果没有调用 find(x),就一定要手动把 x 及其祖先的节点 pushdown. code; #include <bits/stdc++.h> #define N 1 阅读全文
posted @ 2020-06-18 09:53 EM-LGH 阅读(146) 评论(0) 推荐(0)
摘要:脑残了,这题竟然都不会. 显然,把所有左右端点放在一起排序,然后取中位数是 $k=1$ 时最优的. $k=2$ 的时候显然距离中点越近越好,所以将中点扔进去,然后枚举中间的分割点,分割点左右就变成两个子问题了. 动态求中位数的话用平衡树/权值线段树维护就行了. code: #include <bit 阅读全文
posted @ 2020-06-09 11:05 EM-LGH 阅读(135) 评论(0) 推荐(0)
摘要:以前总是不愿意写平衡树,这次规范了一下写法. 1. 建立虚拟节点 -inf 与 inf 2. 每隔 10 次左右 splay 到根 3. 各种操作写递归版就行. code: #include <cstdio> #include <algorithm> #include <cstring> #incl 阅读全文
posted @ 2020-06-01 16:42 EM-LGH 阅读(228) 评论(0) 推荐(0)
摘要:新学了一下笛卡尔树,这道题是模板题,统计一下以 $x$ 为 lca 的点对就行. 然后统计的话用线段树合并 + 启发式合并就行了. code: #include <bits/stdc++.h> #define N 100006 #define ll long long #define lson s[ 阅读全文
posted @ 2020-05-08 22:14 EM-LGH 阅读(235) 评论(0) 推荐(0)
摘要:这道题拿左偏树做的话时间复杂度好像是 $O(n \log n)$ 的,拿 $Splay$ 的话就是 $O(n \log^2 n)$ 的. $Splay$ 真恶心,真心不好写,要不是可以练习代码能力的话我才不用 $Splay$. code: #include <bits/stdc++.h> #defi 阅读全文
posted @ 2020-03-12 21:59 EM-LGH 阅读(168) 评论(0) 推荐(0)
摘要:挺厉害的一道大数据结构题. 由于 LCT 是维护树的形态的,所以说不支持翻转操作. 而在维护序列时 splay 是支持区间翻转的. 所以,我们对于 LCT 中每一个重链都维护一个 splay(这个不同于 LCT 中的 splay) 由于重链是一个序列,所以是支持序列的区间翻转的. 那么我们的翻转,链 阅读全文
posted @ 2020-01-09 16:18 EM-LGH 阅读(176) 评论(0) 推荐(0)
摘要:Description 题解: 随便给定一个括号序列,最终一定能表示成 $..)))))))((((...$ 这种形式. 那么,这个时候答案就是左括号数量/2+右括号数量/2(都是向上取整) 所以,我们考虑用 $Splay$ 来维护这种情况下左括号和右括号的数量. 这里的那个 $swap$ 不是镜面 阅读全文
posted @ 2020-01-07 20:52 EM-LGH 阅读(174) 评论(0) 推荐(0)
摘要:有一个长度为 $m$ 的整数序列 $c$,初始值都是 0 还有一个长度为 $n$ 的操作序列,第 $i$ 个元素用三元组 $(l_{i},r_{i},v_{i})$ 描述,代表将 $c[l_{i}] \sim c[r_{i}]$ 都赋值为 $v_{i}$ 有 $q$ 个询问,第 $i$ 次询问让你求 阅读全文
posted @ 2020-01-07 18:28 EM-LGH 阅读(200) 评论(0) 推荐(0)
摘要:可持久化非旋转treap,真的是又好写又好调 ~ code: #include <cstdio> #include <cstdlib> #include <algorithm> #define N 500007 #define lson t[x].ls #define rson t[x].rs #d 阅读全文
posted @ 2019-12-19 09:44 EM-LGH 阅读(141) 评论(0) 推荐(0)
摘要:这个和 bzoj 5469 几乎是同一道题,但是这里给出另一种做法. 你发现你要求的是一个树上 LIS,而序列上的 LIS 有一个特别神奇的 $O(n\log n) $ 做法. 就是维护一个单调递增的栈,如果发现新加元素大于栈顶,则直接加入,否则在序列中二分出一个大于等于该元素的最小值,然后替换掉. 阅读全文
posted @ 2019-12-02 18:25 EM-LGH 阅读(157) 评论(0) 推荐(0)
摘要:其实之前学过一次非旋转 treap,但是全忘光了,今天复习一下. 洛谷 P3369 【模板】普通平衡树 code: #include <bits/stdc++.h> #define N 100006 #define lson t[x].ls #define rson t[x].rs #define 阅读全文
posted @ 2019-11-30 10:25 EM-LGH 阅读(139) 评论(0) 推荐(0)
摘要:题意:支持插入/删除点 $(x,y)$,查询一个点右上方横坐标与之最接近的点坐标. 我们可以对于每一个操作过的横坐标都开一个 $set$,然后再开一个平衡树,维护每个横坐标上最大的纵坐标. 然后查询点 $(x,y)$ 时就在平衡树查一下第一个横坐标大于 $x$,且最大值大于 $y$ 的就行了. $s 阅读全文
posted @ 2019-11-01 20:53 EM-LGH 阅读(177) 评论(0) 推荐(0)
摘要:挺好的一道题. 假设连了 $i$ 条边且恰好连成了一棵树. 那么下一条连边有 3 种情况:1.连接两个不连通的点. 2.连接的两个点联通,且能构成奇环. 3.连接的两个点联通,能构成偶环. 对于情况1,直接将两个点相连即可. 对于情况2,显然这个奇环存在的时间为 $[s_{i+1},\min_{E 阅读全文
posted @ 2019-09-30 08:04 EM-LGH 阅读(189) 评论(0) 推荐(0)
摘要:建10棵动态树就完事了~ 阅读全文
posted @ 2019-09-25 08:42 EM-LGH 阅读(142) 评论(0) 推荐(0)
摘要:挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲。 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性。 阅读全文
posted @ 2019-08-29 20:54 EM-LGH 阅读(201) 评论(0) 推荐(0)
摘要:首先,一个神奇的结论:一个合法的方案存在的条件是每一个联通块的节点数都是偶数个的. 这个可以用数学归纳法简单证一证. 证出这个后,我们只需动态加入每一个边,并查看一下有哪些边能够被删除(删掉后联通块依然合法). 对于维护加边,删边,我们用动态树. 对于枚举哪些边可以被删,我们可以用堆/set来维护. 阅读全文
posted @ 2019-08-27 14:41 EM-LGH 阅读(263) 评论(0) 推荐(0)
摘要:一眼切~ 重点是按照 $1$~$n$ 的顺序插入每一个数,这样的话就简单了. 阅读全文
posted @ 2019-08-22 20:16 EM-LGH 阅读(161) 评论(0) 推荐(0)
摘要:Description 物理学家小C的研究正遇到某个瓶颈。 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球。主星球没有依赖星球。 我们定义依赖关系如下:若星球a的依赖星球是b,则有星球a依赖星球b.此外,依赖关系具 阅读全文
posted @ 2019-08-10 16:54 EM-LGH 阅读(286) 评论(0) 推荐(0)
摘要:Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1。 在Byte 阅读全文
posted @ 2019-08-10 11:25 EM-LGH 阅读(216) 评论(0) 推荐(0)