值得一说的是,fhq-treap在维护序列时,void split(int p,int x,int &l,int &r)的意思不再是分离<=k和>k的两棵树 而是变为了 将序列p的前x个元素分离出来形成一棵新fhq-treap的l子树,另外的一部分形成另一颗 fhq-treap的r 子树 所以,split你会发现写法像极了前面的普通平衡树的getnum函数 而且新增了懒...
这道题看似简单,不就直接二叉搜索树嘛!但是如果数b是单调递增出现的,则树会成链,那么还是O(n^2)的复杂度。此时我们边用到了Splay,由于splay是不断翻转的,所以就算某一时刻他成了一条链,也会马上旋转而变成另外的形态(深度减低),通过这样不断地变换可以防止长期停留在链的状态,以保证每次操作平均复杂度O(log ...
这是一道经典的Splay模板题——文艺平衡树。 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 输入输出格式 输入格式: 第一行为n,m n表示初始序列有n个数,这个序列依次是(1...
P3391 【模板】文艺平衡树(Splay) 传送门 Splay模板题 考虑如何把一颗树翻转 把它的左右儿子翻转,左右儿子的左右儿子翻转...直到每个节点都被翻转 一颗树这样转后可以发现树的中序遍历也刚好左右翻转了 所以可以用Splay维护,维护标记也不难,只要每次向下之前都先传一下标记就可以了 注意此时Splay节点的大小关系是他...
【洛谷P3391】【模板】文艺平衡树 题目 题目链接:https://www.luogu.com.cn/problem/P3391 您需要写一种数据结构(可参考题目标题),来维护一个有序数列。 其中需要提供以下操作:翻转一个区间,例如原有序序列是\(5\ 4\ 3\ 2\ 1\),翻转区间是\([2,4]\)的话,结果是\(5\ 2\ 3\ 4\ 1\)。
1] == p] = u; //祖父节点pp原来的指向 p 的节点切换成 u tr[p].s[son] = tr[u].s[son ^ 1]; //父亲节点p的原来指向u的节点改成u的儿子 tr[tr[u].s[son ^ 1]].p = p; //u的儿子节点更新其父亲节点为p tr[u].s[son ^ 1...
这是一道经典的Splay模板题——文艺平衡树。 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 输入输出格式 输入格式: 第一行为n,m n表示初始序列有n个数,这个序列依次是(1...
P3391 【模板】文艺平衡树 Solution 方法一(fhq-treap) 文艺平衡树实际上只有一个操作,区间翻转。 那么我们来看看如何实现。 大体上是一致的,但是分裂时要有所改变。 平常我们写的fhq−treapfhq−treap是以数值来分裂的,这里我们换个分裂方式。 以子树大小分裂 ...
P3391 【模板】文艺平衡树 知识点: 平衡树 原题面 题目要求 维护一数列,序列中第ii项初始为ii。 支持区间翻转操作,输出多次翻转后的序列。 分析题意 使被操作序列置于一棵完整的子树中。 通过在 子树根打标记实现区间操作。 Splay 和 Treap 将序列旋转至一棵子树中,...
P3391 【模板】文艺平衡树(Splay) 平衡树 题目背景 这是一道经典的Splay模板题——文艺平衡树。 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1...