思路:明显平衡树维护区间修改,接近于板子题 值得一说的是,fhq-treap在维护序列时,void split(int p,int x,int &l,int &r)的意思不再是分离<=k和>k的两棵树 而是变为了 将序列p的前x个元素分离出来形成一棵新fhq-treap的l子树,另外的一部分形成另一颗 fhq-treap的r 子树 所以,split你会发现写法像极了...
只要我们弄懂Splay,其实本题很简单:首先按照中序遍历建树,然后对于每次修改区间l,r,首先得提出这段区间,方法是将l的前趋l-1旋转到根节点,将r的后趋r+1旋转到根节点的右儿子,我们可以自己画图试试,容易发现经过这个操作后,根节点的右儿子的左子树(具体应该说是这个左子树的中序遍历)就是区间l-r。关键的翻转时...
这是一道经典的Splay模板题——文艺平衡树。 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 输入输出格式 输入格式: 第一行为n,m n表示初始序列有n个数,这个序列依次是(1...
关键的翻转时,因为树是中序遍历(左根右),所以我们只要将l-r(前面所说的根节点的右儿子的左子树)这个区间子树左右儿子的节点交换位置(这样再中序遍历相当于右根左,即做到了翻转操作)。关键是翻转的优化,我们用到懒惰标记lazy[x](表示x是否翻转),每次翻转时只要某个节点有标记且在翻转的区间内,则将标记下放给...
洛谷P3391 【模板】文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树。 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1...
这样翻转后的splay本身不一定具备二叉搜索树的性质 : 左子树任意节点的值 <= 根节点,右子树任意节点的值大于根节点,但是我们这题只用了splay的若干个翻转后可以使某一个子树上的所有点都是[l,r]区间的点这个性质,并没有用到BST的性质,或者说这里的splay是针对编号,第k个数来说的,第k个数一定在k-1个数的...
这是一道经典的Splay模板题——文艺平衡树。 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 输入输出格式 输入格式: 第一行为n,m n表示初始序列有n个数,这个序列依次是(1...
[题解]P3391 文艺平衡树 - Splay解法 P3391 【模板】文艺平衡树给定序列1,2,…,n1,2,…,n,接下来mm次操作,每次操作给定l,rl,r,你需要翻转[l,r][l,r]。所有操作结束后,请输出这个序列。我们先从“普通平衡树”这一题出发,思考一下Splay操作的本质。
洛谷P3391 【模板】文艺平衡树(Splay) 目录 题目背景 题目描述 输入输出格式 输入输出样例 说明 回到顶部 题目背景 这是一道经典的Splay模板题——文艺平衡树。 回到顶部 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,...
P3391 【模板】文艺平衡树(Splay) 传送门 Splay模板题 考虑如何把一颗树翻转 把它的左右儿子翻转,左右儿子的左右儿子翻转...直到每个节点都被翻转 一颗树这样转后可以发现树的中序遍历也刚好左右翻转了 所以可以用Splay维护,维护标记也不难,只要每次向下之前都先传一下标记就可以了...