【HNOI2017】单旋】的更多相关文章

4825: [Hnoi2017]单旋 题意:有趣的spaly hnoi2017刚出来我就去做,当时这题作死用了ett,调了5节课没做出来然后发现好像直接用lct就行了然后弃掉了... md用lct不知道好写到哪里去了1h就写完了 原树的父亲孩子可以直接维护 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <set> usi…
[LG3721][HNOI2017]单旋 题面 洛谷 题解 20pts 直接模拟\(spaly\)的过程即可. 100pts 可以发现单旋最大.最小值到根,手玩是有显然规律的,发现只需要几次\(link,cut\),那么我们维护原树的父子关系以及一颗\(LCT\). 对于插入操作,由于插入的值肯定在前驱的右儿子或后继的左儿子,用\(set\)维护前驱后继即可. 建议自己独立找出规律,这里不再赘述,这题其实细节还是挺多的. 代码 #include <iostream> #include <…
4825: [Hnoi2017]单旋 链接 分析: 以后采取更保险的方式写代码!!!81行本来以为不特判也可以,然后就总是比答案大1,甚至出现负数,调啊调啊调啊调~~~ 只会旋转最大值和最小值,以最小值为例,画一下图可以看出,旋转后,深度分成三部分讨论,最小值的深度(变为1),最小值右子树的深度(不变),其他的点的深度(整体加1).所以线段树维护一下. 现在考虑如何插入一个点,可以知道一个点加入后一定是在前驱的右边,或者后继的左边.一个性质:前驱后继一定在splay上是一个是另一个的祖先的关系(…
4825: [Hnoi2017]单旋 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 667  Solved: 342[Submit][Status][Discuss] Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能.有一天,邪恶的“卡”带着 他的邪恶的“常数”来企图毁灭 H 国.“卡”给…
[BZOJ4825][Hnoi2017]单旋 Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能.有一天,邪恶的“卡”带着他的邪恶的“常数”来企图毁灭 H 国.“卡”给 H 国的人洗脑说,splay 如果写成单旋的,将会更快.“卡”称“单旋 splay”为“spaly”.虽说他说的很没道理,但还是有 H 国的人相信了,小 H 就是其中之一,s…
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能.有一天,邪恶的“卡”带着他的邪恶的“常数”来企图毁灭 H 国.“卡”给 H 国的人洗脑说,splay 如果写成单旋的,将会更快.“卡”称“单旋 splay”为“spaly”.虽说他说的很没道理,但还是有 H 国的人相信了,小 H 就是其中之一,spaly 马上成为他的信仰. 而 H 国的国王…
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能.有一天,邪恶的“卡”带着他的邪恶的“常数”来企图毁灭 H 国.“卡”给 H 国的人洗脑说,splay 如果写成单旋的,将会更快.“卡”称“单旋 splay”为“spaly”.虽说他说的很没道理,但还是有 H 国的人相信了,小 H 就是其中之一,spaly 马上成为他的信仰. 而 H 国的国王…
题目描述 网址:https://www.luogu.org/problemnew/show/3721 大意: 有一颗单旋Splay(Spaly),以key值为优先度,总共有5个操作. [1] 插入一个节点,需返还插入后此节点的深度. [2] 把最小点单旋到根,需要返还旋转前此点深度. [3] 把最大点单旋到根,需要返还旋转前此点深度. [4] 把最小点单旋到根,然后删除根,需要返还旋转前此点深度. [5] 把最大点单旋到根,然后删除根,需要返还旋转前此点深度. 总共有M个操作,数据范围:M <=…
单旋 这道题做法贼多,LCT,splay,线段树什么的貌似都行. 像我这种渣渣只会线段树了(高级数据结构学了也不会用). 首先离线所有操作,因为不会有两个点值重复,所以直接离散. 一颗线段树来维护所有点的深度,并将所有值丢进\(set\)中. 插入操作,在set找到前驱后继,前驱没有右儿子就放前驱右儿子,否则放后继左儿子,同时用\(ch\)和\(fa\)假装模拟树的形态. 旋转操作,在\(set\)里找到节点,可以发现旋转操作该点儿子深度不变,其他点深度加一,处理一下父子关系,然后线段树修改区间…
题目:https://www.luogu.org/problemnew/show/P3721 手玩一下即可AC此题. 结论:插入x后,x要么会成为x的前驱的右儿子,要么成为x的后继的左儿子,这取决于它的前驱和后继的深度. 证明:首先可以证明的是,x的前驱和后继一定存在祖先与后代的关系,因为如果不存在此关系,它们的LCA一定和双方更接近. 然后这个结论画画图就比较显然了. 结论:单旋删除最小值后,它连向根节点的这条路径不发生变化,手玩即可证明,改变的只有它的儿子. 那么这个题就显然可以用LCT来维…
题面 传送门 题解 调了好几个小时--指针太难写了-- 因为只单旋最值,我们以单旋\(\min\)为例,那么\(\min\)是没有左子树的,而它旋到根之后,它的深度变为\(1\),它的右子树里所有节点深度不变,其它所有节点都深度\(+1\).那么这可以看做一个区间加和单点修改的事情,可以用\(Splay\)维护 然后就是插入节点,我们在\(Splay\)里找到它的前驱和后继,那么前驱的右儿子和后继的左儿子必定只有一个是空的,而且只有深度大的那个节点是空的,然后直接把节点插入就行了 还有一个问题就…
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能.有一天,邪恶的“卡”带着 他的邪恶的“常数”来企图毁灭 H 国.“卡”给 H 国的人洗脑说,splay 如果写成单旋的,将会更快.“卡”称 “单旋 splay”为“spaly”.虽说他说的很没道理,但还是有 H 国的人相信了,小 H 就是其中之一,spaly 马 上成为他的信仰. 而 H…
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能.有一天,邪恶的"卡"带着他的邪恶的"常数"来企图毁灭 H 国."卡"给 H 国的人洗脑说,splay 如果写成单旋的,将会更快."卡"称"单旋 splay"为"spaly".虽说他说…
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能.有一天,邪恶的“卡”带着 他的邪恶的“常数”来企图毁灭 H 国.“卡”给 H 国的人洗脑说,splay 如果写成单旋的,将会更快.“卡”称 “单旋 splay”为“spaly”.虽说他说的很没道理,但还是有 H 国的人相信了,小 H 就是其中之一,spaly 马 上成为他的信仰. 而 H…
题目描述 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能.有一天,邪恶的“卡”带着他的邪恶的“常数”来企图毁灭 H 国.“卡”给 H 国的人洗脑说,splay 如果写成单旋的,将会更快.“卡”称“单旋 splay”为“spaly”.虽说他说的很没道理,但还是有 H 国的人相信了,小 H 就是其中之一,spaly 马上成为他的信仰. 而 H 国的国王,自然不允许这…
题目大意 spaly是一种数据结构,它是只有单旋的splay 有一个初始为空的spaly,\(m\)(\(m\leq10^5\))次操作,每个操作是以下5种中的一种: 1.向spaly中插入一个数(过程和treap的插入类似,只不过插入之后不会调整),并询问这个数的深度 2.询问最小值的深度,并将它splay到根 3.询问最大值的深度,并将它splay到根 4.询问最小值的深度,将它splay到根并把它删掉 5.询问最大值的深度,将它splay到根并把它删掉 题解 直接维护spaly的话,spa…
Description \(H\) 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(\(splay\))是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 \(H\) 国的必修技能.有一天,邪恶的"卡"带着 他的邪恶的"常数"来企图毁灭 \(H\) 国."卡"给 \(H\) 国的人洗脑说,\(splay\) 如果写成单旋的,将会更快."卡"称 "单旋 \(splay…
题目   点这里看题目. 分析   最妙的地方在于,这道题其实是用一种数据结构模拟另一种数据结构!   我们需要维护深度和树的结构,以下对于每个操作进行分别讨论. 插入一个新节点   可以发现,这个新节点一定会成为自己的前驱或者后继中深度较大者的儿子.   然后可以更新深度和树的结构. 单旋最小值   发现树会有如下的变化:     如果自己有儿子,那么它只会是自己的右儿子:旋转后,它会接到自己原先的父亲上.     除了自己的儿子以外,其它的节点的深度都会 +1 .     原先的根变成了最小…
这题难道不是spaly裸题吗? 言归正传QWQ 一看到这个题目,其实第一反应是很懵X的 从来没有见过类似的题目啊,什么\(spaly\),单旋.QWQ很懵逼啊 不过,我们可以注意到这么一件事情,就是我们对于树中元素移动的时候,只会移动\(min或者max\). 那么会不会有什么性质呢 QWQ 经过手玩,以\(max\)为栗,我们可以发现我们将这个点单旋到根的话,相当于就是说保持的原树的形态不变,把\(max\)的左儿子连到\(max\)的父亲,然后删除这个点,然后把\(root\)接到\(max…
洛谷题面传送门 终于调出来这道题了,写篇题解( 首先碰到这样的题我们肯定要考虑每种操作会对树的形态产生怎样的影响: 插入操作:对于 BST 有一个性质是,当你插入一个节点时,其在 BST 上的父亲肯定是,你把 BST 中父亲按权值 sort 一遍排成一列后,在待插入的数的两侧的数对应的节点中,深度较大者.因此我们考虑用一个 set,将所有点的权值和编号压进去然后在里面 lower_bound 即可找出待插入点两侧的点. 单旋最小值:稍微画几个图即可发现,对于最小值代表的点 \(x\),如果 \(…
传送门 \(Spaly:\)??? 考虑在暴力模拟的基础上优化 如果要插入一个数,那么根据二叉查找树的性质,这个点一定插在他的前驱的右子树或者是后继的左子树,可以利用set维护当前树里面的数,方便查找前驱后继.不过具体要插到前驱处还是后继处呢?可以把前驱后继在树上的lca找出来,看一下新点如果小于lca的值,往前驱那边走;反之类似 然后后面操作都类似,把树中最值旋到根,可能会删除.通过手玩发现如果要旋最小值,那么最终树中,这个点的父亲的左儿子为这个点的右儿子,并且这个点的右儿子是原来的根,其他的…
题目链接 BZOJ4825 题解 手模一下操作,会发现一些很优美的性质: 每次旋到根,只有其子树深度不变,剩余点深度\(+1\) 每次旋到根,[最小值为例]右儿子接到其父亲的左儿子,其余点形态不改变,然后将该点接到根之上,原根变为其右儿子 每次插入,都是插入到其前驱后继深度较大的那一个点之下 所以我们很容易模拟出树的形态,同时用线段树维护离散化后各权值的深度 #include<iostream> #include<cstdio> #include<cmath> #inc…
BZOJ Luogu 题目太长了,就不放了. 题解 首先声明一点,无论是splay还是spaly,插入一个新的元素,都要rotate到根!所以说题目也算是给了一个错误示范吧. 我们发现把最值旋转到根并不会给这棵spaly造成多大的形态改变,所以考虑用LCT维护这个spaly的形态. 每次插入的时候我们用一个Set来找出插入元素的前驱后继.可以证明,一定会插在前驱或者是后继的对应左右儿子上.判断一下插入即可.除了LCT里的splay外,还要维护一下原树中(spaly中)的父亲.左右儿子关系. co…
这道题可以用LCT做,开set,LCT,二叉树 操作1:直接开set,找到它要插入的位置,一定是前驱,后缀中deep最大的(显然手玩) 操作2:set+LCT询问路径,直接手动提上去,因为树的形态不变 操作3:同2 操作4:LCT::Cut,手动删除 操作5:同4 没了 记得手动更新二叉树(这个一定要想清楚会又WA又TLE又RE n遍) # include <bits/stdc++.h> # define RG register # define IL inline # define Fill…
BZOJ LOJ 洛谷 这题不难啊,我怎么就那么傻,拿随便一个节点去模拟.. 我们只需要能够维护,将最小值或最大值转到根.模拟一下发现,对于最小值,它的右子树深度不变(如果存在),其余节点深度全部\(+1\),且除右儿子外所有点的父子关系不会改变.最大值同理. 因为右子树和右子树外的所有点的值域是连续的,所以按值域为下标维护线段树,区间加即可. 至于怎么维护右子树的范围?不就是\((val_x,val_{fa[x]})\)吗.. 如果是删除,把它转到根后,对所有点深度\(-1\)即可. 考虑如何…
题意 题目链接 Sol 这题好毒瘤啊.. 首先要观察到几个性质: 将最小值旋转到根相当于把右子树变为祖先的左子树,然后将原来的根变为当前最小值 上述操作对深度的影响相当于右子树不变,其他的位置-1 然后就可以做了,把询问离线之后离散化一下,建一棵权值线段树表示每个值对应的深度 同时用set维护出已经加入的值 每次先找到后继,看一下有没有左孩子,如果有的话说明前驱一定没有右孩子. 注意随时更新信息 复杂度\(O(nlogn)\) #include<bits/stdc++.h> #define P…
这个代码已经不是写丑那么简单了--脑子浆糊感觉np++分分钟想暴起打死我--就这还一遍A过了-- 先都读进来hash一下,因为是平衡树所以dfs序直接按照点值来就好 对于每个操作: 1:set维护已插入的值,对新加入的x找到它的前驱后继,选深度大的挂上去(画图找规律,我也不知道为什么深度较浅的一定挂不上去 2.3:对于这个节点x的右子树,深度不变,x深度变为1,其他点深度+1 4.5:先做2.3操作,然后在set里把这个点删掉,整棵树的深度-1 并不是很难但是情况比较多,导致main函数奇丑无比…
题目 \(\rm splay\)水平太差,于是得手玩一下才能发现规律 首先插入一个数,其肯定会成为其前驱的右儿子或者是后继的左儿子,进一步手玩发现前驱的右儿子或者是后继的左儿子一定只有一个是空的,我们找到这个空位置插入就好了 于是我们需要一个\(\rm std::set\)来查找前驱后继,同时我们还需要维护每个点的左右儿子和父亲 继续手玩发现由于只有对最大值和最小值的操作,所以对\(\rm splay\)的结构影响很小,于是这个过程中也能维护每个节点的父亲的左右儿子 深度看起来不能用几个数组来维…
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[1…
[BZOJ4825][HNOI2017]单旋(Link-Cut Tree) 题面 题面太长,懒得粘过来 题解 既然题目让你写Spaly 那就肯定不是正解 这道题目,让你求的是最大/最小值的深度 如果有LCT,答案就很容易求 直接用LCT维护这棵Spaly试试... 手玩发现,最大/最小值旋到根 就是把它的儿子给父亲, 然后root直接变成它的儿子 它变成root 于是乎,每次的操作之和两个点有关 在LCT中维护点在Spaly上的父子关系 这样后面四个操作就解决了问题 第一个操作 一个点显然要么接…