前置知识:线段树
维护区间翻转,\(O(n)=10^6\)
显然,这样的操作不能用线段树来维护,因为线段树的结构是固定的,我们需要一种结构上更加灵活的数据结构
于是联想到平衡树,如果以,对于一个区间 \([l,r]\),我们只需要知道 \(l-1\) 和 \(r+1\) 在平衡树上的位置就可以了,其中间的部分就是翻转的区间
如果翻转的区间是一颗子树,打一个标记表示子树翻转就可以了(注意第 \(x\) 个应该是在平衡树上找第 \(x\) 大)
但正常的平衡树不能使得翻转的区间总在一颗子树上,所以引出了 \(Splay\)
\(Splay\) 基于一个朴实的想法,需要操作的点如果是根那就会很方便,那么在操作时可以先把需要操作的点一路旋转到根就可以了(为了避免被卡,旋转应该有 \(6\) 种,比较繁琐)
如果涉及新的节点(比如插入),只需要找到前驱和后继,依次转到根上,发现前驱和后继之间没有点,然后就可以 \(\Theta(1)\) 插入了
于是翻转区间实际上是一样的,把前驱和后继换成第 \(l-1\) 大和第 \(r+1\) 大就会发现它们之间就是代表区间 \([l,r]\) 的子树
既然 \(Splay\) 能维护区间翻转这种线段树做不到的事,那它显然也可以维护线段树能维护的信息(区间和、区间max之类的),只需要转出区间打 \(tag\),旋转的时候 \(pushup\) 一下就好了
换根,维护 \(LCA\)
实际上可以看做求一个无根树上的‘Y’字形的拐点位置,而拐点处的点是距离'Y'字三点距离和最小的点,也就是
特判一下共线,随便取一条链(以任意一个点为根),三分找拐点(显然是单峰的)
于是就有了 \(\Theta(n\log n)\) 预处理,\(O(\log n)\) 在线回答的方法了
不过上面的和 \(LCT\) 没有什么关系
为了体现 \(LCT\) 是有用的,我们加入维护:链加,链求和 的操作,这样静态树的做法就需要打树剖了,复杂度达到了 \(O(\log^2 n)\)
\(LCT\) 解决上述问题是均摊 \(O(\log n)\) 的
为了做到单 \(\log\) 的复杂度,我们必须摒弃轻重链剖分,转而使用一种可以使得我们需要维护的链上只有 \(O(1)\) 个区间需要用数据结构维护的新的剖分方式
可以证明,不存在比轻重链剖分更优秀的静态剖分方式
那只能考虑动态剖分了,也就是会更改点的重儿子(不妨继承轻重链中的称谓),那么自然也不能用线段树维护链信息了。我们依然保留轻重链的优秀性质:一条链上点的深度严格单调且连续。在此基础上,以点的深度作键值,用 \(Splay\) 维护链就可以做到 \(O(1)\) 更改重儿子了(假如我们已经知道要选择哪个轻儿子称为重儿子;当然,\(pushup\) 被认为是 \(O(1)\)的)。特殊地,为了更好的维护信息,一个点可以没有重儿子。
采用上述的方法,对于一个固定的根,我们只需要使它没有重儿子,一路暴力的把从它到根的路径上所有轻边变为重边就可以得到一条它到根的路径了,这样的操作被称为 \(access\)。(不妨回到 \(Splay\) 的复杂度证明再向下翻一点)
有了 \(access\),我们容易维护 链加,链求和,只需要再考虑 换根,LCA
LCA 的操作容易处理,只需要维护最深的没有改变过的节点就可以了
对于 换根 操作,我们观察发现轻边的属性完全由父节点表示,而父节点信息全部维护在 \(Splay\) 中,那么只需要把 \(access\) 之后的 \(Splay\) 整个翻转,重链上的点深度也就反转了!而根完全等价于深度最小的点,且 \(Splay\) 可以方便的找到点的深度的相对大小,于是我们就完成了 换根 的操作。这种操作被称为 \(makeroot\)
特殊地,为了更好的维护信息,一个点可以没有重儿子。
这启发我们用 \(LCT\) 维护更多问题,比如
连边,删边(保证无环),维护连通性
无环就是森林,而连通性等价于两点所在树的根是否相同,采用同样的思路,只需要把一条边中的随便一个点钦定为父亲,儿子 \(makeroot\) 后直接连上去就可以了
我也不知道是不是 \(Top\ Tree\)
树剖可以维护子树操作,\(LCT\) 当然也可以(不然有什么用)
之前在 \(LCT\) 中,我们只维护了实(重)儿子的信息,我们把所有虚儿子放到一个 \(BST\) 里,要换的时候就挪出来,在 \(BST\) 上再维护所有虚儿子的信息,也就是被称为 \(LCT\) 三度化的操作。这样复杂度依然是对的(可我就不会证了)
这样的好处就是只需要维护两个差不多的数据结构就可以修改子树信息了(从轻儿子处跳上来的时候把 \(BST\) 里的标记下方一下就好了)
然后似乎就等价于 \(Top\ Tree\) 了?
还是简要介绍一下原始的 \(Top\ Tree\):
定义 \(Top\ Cluster\) 为一个树上点集,所有 \(cluster\) 的交为整颗树,任意一个 \(cluster\) 至多有两个顶点和其他 \(cluster\) 公用,这样的顶点叫做界点
原本树上的边都可以看做一个 \(cluster\),最后可以把所有 \(cluster\) 合并为一个表示整颗树的 \(cluster\)。存在 \(O(n)\) 的建立方式,建立的过程中,每合并一次,就从合并后的 \(cluster\) 向合并前 \(cluster\) 连边(方向不重要),构成的树就叫 \(Top\ Tree\)
可以很 trivial的基于 \(Top\ Tree\) 在 \(O(\log n)\) 的时间内得到任意需要的 \(cluster\),不过似乎和 \(LCT\) 的写法是等价的
另一种维护动态树的方法
一颗树的 \(Euler\ Tour\) 和 \(dfs\) 序没有什么区别,只是名字不同,也就是从根出发,过一个点一次就在一个序列末尾加入其数据,最后的序列就是 \(ET\)
发现 \(LCT\) 即使进行了三度化也很难维护半群的信息(它要求有逆元),但在序列上维护半群是容易的,用 \(splay\) 维护序列是基础的想法
但是用 \(dfs\) 序我们只能很方便的表示出子树的区间,而对于则缺乏威力
规范一下说法,我们把一个点 \(i\) 在 \(ET\) 上第一次出现的位置叫做 \(s_i\)
我们发现,把所有子树无序地存储实在过于低效,我们可以把 \(LCT\) 中的 \(splay\) (也就是实链)上的点记做 \(x_1,x_2,x_3\cdots x_k\),显然,它们在同一颗子树内并且深度差为 \(1\),于是,我们可以让 \(s_{x_1},s_{x_2}\cdots s_{x_k}\) 在 \(ET\) 上也构成连续的一段
这样一条实链的修改就是在序列上对 \([s_{x_1},s_{x_k}]\) 的修改,用 \(splay\) 维护序列可以做到 \(O(\log^2 n)\) (事实上,这比 \(Top\ Tree\) 慢,但可能更容易理解)
流程就是:我们用 \(LCT\) 维护原树的结构,\(splay\) 在 \(ET\) 上维护数据
唯一的困难就是维护 \(s_i\) 了,显然只需要关注 \(\operatorname{access}\),发现就是把一段 \(s\) 平移到另外一段的后面,区间平移可以用区间翻转做到,然后就做完了,反正 \(\operatorname{makeroot}\) 的时候也需要区间翻转
非常好写(迫真)
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报
VXLAN简介定义RFC定义了VLAN扩展方案VXLAN(VirtualeXtensibleLocalAreaNetwork,虚拟扩展局域网)。VXLAN采用MACinUDP(UserDatagramProtocol)封装方式,是NVO3(NetworkVirtualizationoverLayer3)中的一种网络虚拟化技术。目的随着网络技术的发展,云计算凭借其在系统利用率高、人力/管理成本低、灵活性/可扩展性强等方面表现出的优势,已经成为目前企业IT建设的新趋势。而服务器虚拟化作为云计算的核心技术之一,得到了越来越多的应用。服务器虚拟化技术的广泛部署,极大地增加了数据中心的计算密度;同时,为
目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式 2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置 3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一
这篇文章,主要介绍如何使用SpringCloud微服务组件从0到1搭建一个微服务工程。目录一、从0到1搭建微服务工程1.1、基础环境说明(1)使用组件(2)微服务依赖1.2、搭建注册中心(1)引入依赖(2)配置文件(3)启动类1.3、搭建配置中心(1)引入依赖(2)配置文件(3)启动类1.4、搭建API网关(1)引入依赖(2)配置文件(3)启动类1.5、搭建服务提供者(1)引入依赖(2)配置文件(3)启动类1.6、搭建服务消费者(1)引入依赖(2)配置文件(3)启动类1.7、运行测试一、从0到1搭建微服务工程1.1、基础环境说明(1)使用组件这里主要是使用的SpringCloudNetflix
目录文章信息写在前面Background&MotivationMethodDCNV2DCNV3模型架构Experiment分类检测文章信息Title:InternImage:ExploringLarge-ScaleVisionFoundationModelswithDeformableConvolutionsPaperLink:https://arxiv.org/abs/2211.05778CodeLink:https://github.com/OpenGVLab/InternImage写在前面拿到文章之后先看了一眼在ImageNet1k上的结果,确实很高,超越了同等大小下的VAN、RepLK
文章目录前言一、注册小程序二、项目创建三、运行项目四、其他配置最后前言此次项目开发使用uniapp和uview进行开发,需要用到的开发工具为HBuilderX和微信开发者工具,具体的安装方式见官网,小程序注册见微信公众平台。一、注册小程序注册在微信公众平台注册小程序,按照提示注册完后会发配一个appid和密钥,需要复制保存好。完善信息设置=>基本设置,填写小程序基本信息,包括名称、头像、介绍及服务范围等。第三方设置根据开发需求添加插件授权。成员管理管理=>成员管理,点击编辑或下拉选择添加成员,输入微信号添加新的项目成员,只有成员可以进行真机测试。体验成员可以使用发布的体验版。开发设置开发=>开
ESP32学习笔记(七)复位和时钟目录:ESP32学习笔记(一)芯片型号介绍ESP32学习笔记(二)开发环境搭建VSCode+platformioESP32学习笔记(三)硬件资源介绍ESP32学习笔记(四)串口通信ESP32学习笔记(五)外部中断ESP32学习笔记(六)定时器ESP32学习笔记(七)复位和时钟1.复位2.系统时钟2.1时钟树2.2时钟源从时钟树可以看出时钟源共七种ESP32的时钟源分别来自外部晶振、内部PLL或振荡电路具体地说,这些时钟源为:2.2.1快速时钟PLL_CLK320MHz或480MHz内部PLL时钟XTL_CLK2~40MHz外部晶振时钟,模组板载的是40MHz晶