题目描述 Link 你需要写一个文本编辑器,支持: Move k:将光标移动到第走个字符之后,如果 \(k=0\),将光标移到文本第一个字符之前。 Insert n (换行) S:在光标后插入长度为 \(n\) 的字符串 \(S\),光标位置不变,\(n \ge 1\)。 Delete n:删除光标后的 \(n\) 个字符,光标位置不变,\(n \ge 1\)。 R
参考博客: https://blog.csdn.net/hellochenlu/article/details/53022709 参考博客: https://blog.csdn.net/amoscykl/article/details/81589827 本章问题 1.splay逐层伸展到根和双层伸展有什么区别呢? 假设节点的个数为n,则旋转操作的总次数的为(n-1)+{(n-1)+(n-2)+(n-3)+…+1
和重链剖分的概念有点点像。或者应该叫做实链剖分。 LCT维护的“原树”并非是一棵树,而是一片森林。森林中的树可以切成各种形状的树,也可以把不同的树合并。LCT内部的“辅助树”也不是一棵树,而是一片(更大的)Splay森林。 原树是一棵有根树。支持以下操作: 1、对原树节点x和节点y的链更
并查集 + splay启发式合并 - AcWing 1063 - 永无乡 本题用并查集维护连通性,用splay支持在线查询第k大。为了使得splay能够完成合并操作,本题需要利用启发式的思想,即每次合并都将节点数少的splay的所有节点加入到节点数较多的splay中去。可以证明,splay的启发式合并的复杂度为\(O(nlo
Splay树 首先介绍BST,也就是所有平衡树的开始,他的China名字是二叉查找树。 BST性质简介 给定一棵二叉树,每一个节点有一个权值,命名“关键码”,至于为什么叫这个名字,我也不知道。BST的性质就是,对于树中任何一个节点,都满足以下性质: 1.这个节点的关键码不小于它的左子树上任意一个
int tot; int root; int father[maxn];//维护节点父亲节点编号 int child[maxn][2];//维护节点左右子节点编号 int key[maxn];//维护节点权值 int num[maxn];//维护节点代表权值的数目 int sz[maxn];//维护节点(含自身)子树总大小 void updata(int x)//更新数目 { sz[x]
LCT(Link-Cut-Tree) LCT维护一个森林,即把每个节点用splay维护,可以进行许多操作: 查询、修改链上的信息 随意指定原树的根(即换根) 动态连边、删边 合并两棵树、分离一棵树 动态维护连通性 等 主要性质 每一个Splay维护的是一条从上到下按在原树中深度严格递增的路径,且
干啥用的? 对于一个森林,查询链上信息、 前置芝士:splay P3690 【模板】Link Cut Tree (动态树) (开始大量盗图) 首先确定LCT的一些基本概念 实边:每个点最多连一条实边(类似树剖),这个边是随便连的,而且是可以变的、虚边:不是实边的边 实链:对于每个实边构成的链(这条链必须是从上到下深度递增),
\(\text{Description}\) 传送门 \(\text{Solution}\) 据说是伪 \(\text{ETT}\)。 但既然不会那玩意儿,所以把它称作——欧拉序 \(+\) 平衡树。 具体怎么做呢?我们设点 \(u\) 的进入,出去的时间戳为 \(st_u,ed_u\)。然后在欧拉序序列上建一棵平衡树,给 \(st_u\) 的权值赋为 \(val_u\),给
在众多数据结构,\(Link-Cut\ Tree\),或者叫作动态树,以其代码的长度著称,在学习了\(1\)天\(LCT\)并深深地被其恶心到之后,我决定口糊这样一篇学习笔记。 在学\(LCT\)之前,你需要先学会树链剖分与\(Splay\)。 定义及性质 树链剖分大家都知道,是可以用来解决树上路径、子树相关问题的方法,而
目录LCT 笔记主要功能和其它数据结构的比较思想虚实剖分如何维护所有的链实链虚边开始构思具体要维护的功能(从基础到高级)Splay部分access(u)make(u)find(u)split(u,v)link(u,v)cut(u,v)复杂度talk is cheap 最近在复习学过的省选算法,发现以前学的太不扎实了,太逊了,有必要做笔记整理
这个 \(LCT\) ,我听得很懵逼 在 \(Splay\) 里面,好像有重链 不用线段树,\(Splay\) 来维护 树的形态有改变,不只是那一条边 所以要把整棵树,重新剖一遍 什么重链~什么轻边~什么重儿子 节点 \(PPT\) 上的操作演示,今天上午的丢人考试,不忍直视。 \(PPT\) 上的一个圈,一圈就是一条边 老天爷你
昨天CF上去就A了前三道题,然后自闭罚坐一个小时什么也没写出来23333。似乎D题人均wa3发就很烦。还是肤浅了 今天精神状态不太好,可能是晚睡的缘故,那不如明天一起写了算了 蹲一波大选结果,蹲一波splay,蹲一波队友,蹲一波填坑,好的,今天就这样
洛谷P4200 千山鸟飞绝 题意 有\(n\)只鸟在一个二维平面上,每只鸟都有一个威武值,每只鸟的士气值为处在和它同一坐标的鸟中的最大威武值,团结值为处在和它同一坐标的鸟的个数,计算士气值和团结值时不能算上自己。 每只鸟的初始威武值和坐标为\(w,x,y\)。 一共有\(t\)秒,鸟王每秒会发出一
首先可以观察到这样一个事实,如果 \((x, y)\) 出队,那么只会影响 \(x\) 这一行,以及最后一列的排布。并且可以发现,每次一个人出队,总会对最后一列有影响,因此我们可能需要将最后一列单独拿出来维护。让我们来想一想,什么东西可以支持删除一个数,插入一个数,查询排名为第几的数,显然 \(Splay
卡常太难了 链接:论OI中各种玄学卡常 卡常常识 为何卡常?什么时候要卡常? 通常像分块,莫队等等这样的根号算法以及某些常数巨大的算法(如 Splay 等)可能会被卡常。考试的时候非正解算法有时卡常能够拿到更多的分数(尤其是面对数据不是非常大,算法又常常跑不满的时候,可能会 \(n^2\) 过一
P3165 [CQOI2014]排序机械臂 题目链接 题意 给一个长度为\(n\)序列\(a_1,a_2,\dots,a_n\),第\(i\)次操作选择第\(i\)小的数字,找到它的位置\(p\),翻转区间\([i,p]\)。 分析 先不考虑哨兵\(-inf\)和\(inf\)。 在平衡树中插入下标\(1\sim n\),对每个数字\(a_i\)记录它的下标在平衡树中的
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+100; const int inf=1e9; int root,tot; int a[maxn]; int pos[maxn]; int rub[maxn]; int top; int n,m; struct Splay_tree { int ch[2];//左右儿子 int size;//子树大小 int fa;//父亲 int
题目链接 #include <iostream> #include <cstdio> #include <algorithm> #define maxn 100005 using namespace std; int n,m; int val[maxn],num[maxn],siz[maxn],ch[maxn][3],fa[maxn],maxx[maxn],sum[maxn],flag[maxn],cnt,root; void pushup(int x) { siz[
距离上次写splay已经过去了10个月了,今天高兴地重拾了平衡树,赶紧过来写一下自己的写法,以后好养成习惯 需要解释的尽量在代码里注释了,就不过多说了 检查x是父亲的左儿子还是右儿子 int chk(int x) { return ch[fa[x]][1] == x; } pushup void pushup(int x) { size[x] = si
有关前置知识例如BST旋转,可查看之前的treap博客。 简单一谈: BST: 二叉搜索树,对于任意一结点满足左子树<根节点<右子树。 旋转: 用动画说明,生动形象。分别是左旋右旋: splay: 基本原理: 因为一棵二叉搜索树可能会出现深浅不一,树的重心偏移的问题,导致搜索时间的不稳定,甚至
Introduction Splay 在维护数集方面效率并不算突出,但可以高效维护数列并进行数列的一些操作,甚至是线段树所做不了的(比如区间翻转)。 所以掌握 Splay 还是很重要的,而且理解了就不难了。 Range Selection Splay 的最经典的应用莫过于 区间翻转 了。 「Luogu P3391」【模板】文艺平衡
题意 给你一个1-n的排列,1,2,...n 求翻转k次之后的序列 例如:1,2,3,5,4 翻转2-4 -> 1,5,3,2,4 题解 首先,splay操作之后的中序遍历是不会发生变化的。初始序列无论splay多少次中序遍历不变 中序遍历有一个显而易见的性质,就是左子树和右子树交换之后,中序遍历也就翻转了。 题目中的翻
简介 Splay是一种平衡二叉树。它通过不断地将某个节点旋转到根节点,使整棵树仍然满足二叉查找树的性质,并且保持平衡而不至于退化成链。 Splay的时间复杂度是按总复杂度来算的,具体来说,即是: 从空树开始,做插入、删除、访问操作共M次,树中最多同时存在N个点, 则总时间复杂度不超过\(O(Mlo
Splay 暴力维护节点信息即可 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int delta,t1,t2,t3,k[1000005],ch[1000005][2],fa[1000005],a[1000005],t[1000005],n,ind,root,opera[