QWQ硬是把一个\(splay\)好题,做成了\(LCT\) 首先,根据题目性质,我们可以发现序列之间是具有前后性质的. 那么,我们就不可以进行\(makeroot\)等操作. 我们定义\(findroot(x)表示x所在splay最前面的点(深度最小的点)\) \(findymh(x)表示x所在splay最后面的点(深度最大的点)\) 对于1操作,我们只需要让前面序列最后面的点,连接到后面序列最前面的点,然后\(access(findymh(x))\) 对于2操作,我们直接\(splay\)到…
题目传送门 部落冲突 格式难调,体面就不放了. 分析: julao们应该都看得出来就是个$LCT$板子,战争就$cut$,结束就$link$,询问就$find$.没了... 太久没打$LCT$,然后发现自己之前貌似理解得并不透彻,打得还是不熟... Code: //It is made by HolseLee on 5th Sep 2018 //Luogu.org P3950 #include<cstdio> #include<cstring> #include<cstdli…
Code: #include <cstdio> //SDOI2010 染色 #include <algorithm> #include <cstring> #include <string> using namespace std; void setIO(string a) { freopen((a+".in").c_str(),"r",stdin); } struct LCT { #define maxn 20000…
这可真是道神仙题QWQ问了好多\(dalao\)才稍微明白了一丢丢做法 首先,我们假设不存在\(1\)操作,那么对于询问的一段区间中的所有的树,他们的形态应该是一样的 甚至可以直接理解为\(0\)操作就是表示所有树的生成节点都添加一个儿子 其实就算存在\(1\)操作,也是类似同理的. 这样考虑: 考虑如果在 \(l\)处更换了生长节点,那么就相当于把第 \(l−1\) 棵树之后生长的节点都"嫁接"在这个新的生长节点上.我们可以想象对于每一个\(1\)操作建一个虚点,然后0操作生长的点都…
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压 顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨 威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在 这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 30000.之后,他把自己的战舰也依次编号…
这个题目很有意思 QWQ 根据题目描述,我们可以知道,首都就是所谓的树的重心,那么我们假设每颗树的重心都是\(root\)的话,对于每次询问,我们只需要\(findroot(x)\)就可以. 那么如何处理\(link\)操作呢QWQ 这里是看了题解,我才知道是怎么做的 大致的思想就是: !启发式合并! 首先,这里需要注意树的中心具有的两个性质: 1.以这个点为根,那么所有的子树(不算整个树自身)的大小都不超过整个树大小的一半. 2.假设两个联通块x和y进行合并,而且\(size(x)>size(…
洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2......(相信各位Dalao一定做过这道题) 这里的维护懒标记方法很像.除了翻转标记以外还要维护乘法标记和加法标记. 根据运算优先级,乘法是要先算的,所以先放,放的时候子树的\(sum\),乘法标记,加法标记,儿子的\(val\)统统都要乘一遍. 放加法标记的时候,想到线段树的区间大小是稳定的,而Splay…
洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环么? 于是,一个森林的模型被我们建出来了. 考虑到有修改弹力值的操作,也就是要断边和连边,于是用LCT维护. 思路一 每一个点向它弹到的位置连边.如果被弹飞了,那么这条边就不存在. 查询弹飞的步数,就是查询该点到其所属原树中根节点的路径的\(size\). 注意此题的一些特性.我们并不需要查询或者更…
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小生成树弄出来,因为要求次小生成树.至于为什么次小一定只在最小的基础上改变了一条边,我也不会严谨的证明......打表找规律大法好 剩下的可以有一堆数据结构来维护最大值和次大值(原理两位巨佬都讲清楚了,这里只分析一下算法的优劣) kruscal+倍增+LCA 山楠巨佬的做法,我也写了这一种.复杂度\(…
洛谷题目传送门 LCT维护子树信息常见套路详见我的总结 闲话 题目摘自WC模拟试题(by Philipsweng),原题目名Wander,"山村游历"是自己搞出来的中文名. 数据自测,如有问题欢迎反馈 对耐心的人来说,这道题是个裸题(当我什么也没说) 题面 题目描述 在一个偏远的小镇上,有一些落后的山村.山村之间通过一些道路来连接.当然有的山村可能不连通. 一年当中会发生很多大事,比如说有人提议要在山村\(i\)与\(j\)之间修建一条道路,也有人觉得山村\(i\)和\(j\)之间的道…
传送门 洛谷 BZOJ Solution 如果不需要动态的话,那就是一个裸的最小生成树上的最大边权对吧. 现在动态了的话,把这个过程反着来,就是加边对吧. 现在问题变成了怎么动态维护加边的最小生成树,这是一个比较常见的套路了,使用LCT(暴力)... 深刻理解一下Kruscal的过程,就是每一次选不在连通块内的最小边权. 那么我们如果加了一条边,显然会形成一个环,我们只要删除这个环里面最大的边权就好了. 所以LCT动态维护路径上的最大值然后根据情况\(Cut*2+Link*2\)就好了... 代…
洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的输出状态只有\(0/1\),于是每个点的总状态也非常有限,可以根据权值为\(1\)的儿子数量\(0-3\)分为四种,记为该点的点权. 我们都会模拟暴力过程--先改叶子节点(先默认为\(0\)改为\(1\)),如果它的父亲此时权值为\(1\)的儿子数量从原来小于\(0\)的变成大于\(0\)的,那么父…
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类对树的边进行轻重划分的操作,这样做的目的是为了减少某些链上的修改.查询等操作的复杂度. 目前总共有三类:重链剖分,实链剖分和并不常见的长链剖分 重链剖分 实际上我们经常讲的树剖,就是重链剖分的常用称呼. 对于每个点,选择最大的子树,将这条连边划分为重边,而连向其他子树的边划分为轻边. 若干重边连接在…
题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这实际上就是动态地维护MST.用LCT维护MST,路径询问也能直接查询,每次删边看这条边是否在MST上. 只有1000个点!边直接矩阵存. 而且删边次数很少,于是最初想的是每次删边用堆优化Prim O(nlogn)重新求一遍MST.但是\(5000*1000*10=5e7\)..(也许行吧) 日常删边改成加边,…
洛谷题目传送门 思路分析 最简单粗暴的想法,肯定是大力LCT,每个树都来一遍link之类的操作啦(T飞就不说了) 考虑如何优化算法.如果没有1操作,肯定每个树都长一样.有了1操作,就来仔细分析一下对不同树的影响. 假设有一个1操作形如\(l\ r\ x\),那么从微观来看差异,我们只关注第l-1棵树和第l棵树.再假设以后都没有了0操作,那么我们可以认为,第l棵树是第l-1棵树把这个1操作以后嫁接在原来生长节点上的所有节点(以及所有子树)全部转而嫁接到x上.再看第r棵树和第r+1棵树,是不是可以认…
洛谷题目传送门 ZJOI的考场上最弱外省选手T2 10分成功滚粗...... 首先要想到30分的结论 说实话Day1前几天刚刚刚掉了SDOI2017的树点涂色,考场上也想到了这一点 想到了又有什么用?反正想不到最大的贡献是怎么推出来的 然后晚上心中怀着九条CNM看完了Solution.pdf 貌似对我这个蒟蒻来说也只有这一题可做了...... 已知书上每个点access的总次数,构造出一个顺序,最大化虚实边的切换总次数 其实如果能发现最优顺序的构造是没有后效性的话,问题便可以进一步简化 考虑每个…
洛谷题目传送门 膜拜神犇出题人管理员!!膜拜yler和ZSY!! 没错yler连续教我这个蒟蒻写起床困难综合症和睡觉困难综合症%%%Orz,所以按位贪心的思路可以继承下来 这里最好还是写树剖吧,不过我根本不会,于是只好来个LCT,用unsigned long long维护链上双向的按位操作.具体方法yler已经讲得很好啦 注意因为信息的维护是有方向性的,所以pushdown要写规范...... #include<cstdio> #define RG register #define R RG…
洛谷题目传送门 太弱了不会树剖,觉得LCT好写一些,就上LCT乱搞,当LCT维护双连通分量的练手题好了 正序删边是不好来维护连通性的,于是就像水管局长那样离线处理,逆序完成操作 显然,每个点可以代表一个双连通分量,查询就是链的长度-1 连接一条边,如果在LCT中还没连通就link,如果连通了,显然这里会出现一个环,然后暴力缩点,可以把当前辅助树的根节点当做集合的标志节点,然后dfs整个辅助树,把链上的其它点的并查集祖先暴力改成这个标志节点,最后再断开标志节点与子树的连接.总的暴力修改次数不会超过…
洛谷题目传送门 最无脑LCT题解,Dalao们的各种算法都比这个好多啦... 唯一的好处就是只管码代码就好了 开战cut,停战link,询问findroot判连通性 太无脑,应该不用打注释了.常数大就不用说了(逃 #include<cstdio> #include<cstdlib> #define R register int #define I inline void #define lc c[x][0] #define rc c[x][1] #define G ch=getch…
洛谷题目传送门 思路分析 维护子树最值还是第一次写QwQ 因为子树的最值会变化,所以不能简单地把最值记下来,还要维护一个平衡树,把每个子树的最大值扔进去,来资磁插入.删除和查询最值. 然后我就懒得手写了,毕竟Splay作为平衡树时与LCT中的Splay写法不一样,不能混用. 于是要去学习STL啦 非常感谢Kelin巨佬的代码,我终于初步掌握了一下set的用法 (比如说知道了multiset的erase某值是把所有等于该值的节点删除......) (还比如说知道了rbegin和end的区别....…
洛谷题目传送门 思路分析 题意就是要维护同色连通块大小.要用LCT维护子树大小就不说了,可以看看蒟蒻的LCT总结. 至于连通块如何维护,首先肯定可以想到一个很naive的做法:直接维护同色连通块,每次更改时暴力修改父边和子边...... 来个菊花图吧!(话说我真的好弱,前几天ZJOI的时候才知道对于某点度数很大的树/图有这样的称呼,真是很形象哈23333) 既然这条路行不通,那就换一种模型吧. 这是一种高级的维护染色连通块的较为通用的模型. 感觉蒟蒻对这种模型的理解与许多巨佬有不一样的地方,在这…
Update:原来的洛谷U21715已成坑qwq 已经被某位管理员巨佬放进公共题库啦!又可以多一个AC记录啦! 洛谷题目传送门 其实也可以到这里交啦 思路分析 动态维护树的重心 题目中说到国家的首都会选在某个使得其他城市到它距离之和最小的城市,那不就是树的重心了嘛.树的重心性质真的很好,看看wuhulala巨佬的这篇博客. 网上大多数解法都是启发式合并.利用了以重心为根的子树大小不超过原树的一半,每次合并两颗树的时候,小的往大的上面合并,而且是一个点一个点地link上去,每次link完检查一下这…
洛谷题目传送门 思路分析 在一个图中,要求路径上最大边边权最小,就不难想到最小生成树.而题目中有删边的操作,那肯定是要动态维护啦.直接上LCT维护边权最小值(可以参考一下蒟蒻的Blog) 这时候令人头疼的问题又冒出来了......删掉一条边以后,又不好从树断开后的两边选出最小的边在连上.这是根本维护不了的. 于是蒟蒻又get到了一个新套路--顺序解决不了的问题,可以离线询问,反过来处理.原来的删边变成了加边,就很方便了.直接split找出环上的最大边,当前要加的边比它小就替换掉. 一个做法的问题…
洛谷题目传送门 和魔法森林有点像,都是动态维护最小生成树(可参考一下Blog的LCT总结相关部分) 至于从小到大还是从大到小当然无所谓啦,我是从小到大排序,每次枚举边,还没连通就连,已连通就替换环上最小的一条边,可以保证最优.如果已经构成了生成树,就可以更新答案,因为当前枚举到的一定是生成树里最大的,所以直接用当前减去最小更新答案. 至于最小的怎样维护,其实根本不需要什么别的set什么的数据结构.只要标记一下在生成树中的边,再搞一个指针指向在树中最小的边就好啦.当最小的边也被替换,就把指针后移,…
洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要喧宾夺主了...(至少在代码上看是如此) 思路分析 一个一个操作来(瞎BB中,这种思路模式并不具有普遍性......) 1操作 还好我没学树剖233333以至于(直接想到)只好用LCT来维护颜色. 题目透露出的神奇的性质--每一种颜色,无论在任何时刻,肯定是一条链,而且点的深度严格递增! 而且还特意…
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小生成树弄出来,因为要求次小生成树.至于为什么次小一定只在最小的基础上改变了一条边,我也不会严谨的证明......打表找规律大法好 剩下的可以有一堆数据结构来维护最大值和次大值(原理两位巨佬都讲清楚了,这里只分析一下算法的优劣) kruscal+倍增+LCA 山楠巨佬的做法,我也写了这一种.复杂度\(…
洛谷题目传送门 LCT维护子树信息常见套路详见我的总结 闲话 题目摘自WC模拟试题(by Philipsweng),原题目名Wander,"山村游历"是自己搞出来的中文名. 数据自测,如有问题欢迎反馈 对耐心的人来说,这道题是个裸题(当我什么也没说) 题面 题目描述 在一个偏远的小镇上,有一些落后的山村.山村之间通过一些道路来连接.当然有的山村可能不连通. 一年当中会发生很多大事,比如说有人提议要在山村\(i\)与\(j\)之间修建一条道路,也有人觉得山村\(i\)和\(j\)之间的道…
题目:https://www.luogu.org/problemnew/show/P4546 先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分: 注意各处 pushup,而且 splay 维护的是一条链但其形态不一定是一条链! #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespa…
点此看题面 大致题意: 有一棵初始边权全为\(1\)的树,四种操作:将两点间路径边权都加上一个数,删一条边.加一条新边,将两点间路径边权都加上一个数,询问两点间路径权值和. 序列版 这道题有一个序列版:[洛谷3373][模板]线段树 2. 看题目就知道是一道线段树板子题. 这种题目移到树上路径中,且要删边加边,是\(LCT\)无疑了. \(LCT\)维护懒惰标记 可以说,这道题就是上面那题的翻版. 同样维护两个标记:乘法标记和加法标记,加上原有的翻转标记,共三个标记. 具体细节其实可以详见上面提…
洛谷题面传送门 终于调出来这道题了,写篇题解( 首先碰到这样的题我们肯定要考虑每种操作会对树的形态产生怎样的影响: 插入操作:对于 BST 有一个性质是,当你插入一个节点时,其在 BST 上的父亲肯定是,你把 BST 中父亲按权值 sort 一遍排成一列后,在待插入的数的两侧的数对应的节点中,深度较大者.因此我们考虑用一个 set,将所有点的权值和编号压进去然后在里面 lower_bound 即可找出待插入点两侧的点. 单旋最小值:稍微画几个图即可发现,对于最小值代表的点 \(x\),如果 \(…