题目传送门 部落冲突 格式难调,体面就不放了. 分析: 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…
2856. [洛谷U14475]部落冲突 ★★★   输入文件:lct.in   输出文件:lct.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事. 其中,在大大小小的部落之间,会有一些道路相连,这些道路是Travian世界里的重要枢纽,简单起见,你可以把这…
洛谷题目传送门 最无脑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…
题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事. 其中,在大大小小的部落之间,会有一些道路相连,这些道路是Travian世界里的重要枢纽,简单起见,你可以把这些部落与部落之间相连的道路看作一颗树,可见每条道路对于Travian世界的重要程度.有了这些道路,建筑工人就可以通过这些道路进行友好外交啦. 然而,事情并不会像想象的那样…
题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事. 其中,在大大小小的部落之间,会有一些道路相连,这些道路是Travian世界里的重要枢纽,简单起见,你可以把这些部落与部落之间相连的道路看作一颗树,可见每条道路对于Travian世界的重要程度.有了这些道路,建筑工人就可以通过这些道路进行友好外交啦. 然而,事情并不会像想象的那样…
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例1 输出样例1 输入样例2 输出样例2 输入样例3 输出样例3 说明 思路 AC代码 总结 题面 题目链接 P3950 部落冲突 题目描述 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事. 其中,在大大小小的部落之间,会有一些道路相连,这些道路是Tr…
题目大意:给你一棵树,有$3$个操作: $Q\;p\;q:$询问$p,q$是否连通 $C\;p\;q:$把$p->q$这条边割断 $U\;x:$恢复第$x$次操作二 题解:可以在割断时把这条边赋值上$1$,恢复时赋成$0$,只需要求$p->q$路径和是否为$0$即可,可以用$dfs$序+树状数组维护 卡点:$LCA$越界 C++ Code: #include <cstdio> #include <cctype> #include <algorithm> na…
传送门 拿到题目,一看 裸LCT (其实是我懒得打,splay又臭又长) 首先,这道题的意思就是删掉一些边 所以常规操作 点权转边权 之后对于战争操作,在对应的边上+1 对于和平操作,在对应的边上-1 然后对于询问,即统计从$u$到$v$的路径上的和 如果和为$0$,即表明可以到,否则不能到 代码 #include<bits/stdc++.h> namespace my_std { using namespace std; #define rep(i,a,b) for (int i=(a);i…
这个题目很有意思 QWQ 根据题目描述,我们可以知道,首都就是所谓的树的重心,那么我们假设每颗树的重心都是\(root\)的话,对于每次询问,我们只需要\(findroot(x)\)就可以. 那么如何处理\(link\)操作呢QWQ 这里是看了题解,我才知道是怎么做的 大致的思想就是: !启发式合并! 首先,这里需要注意树的中心具有的两个性质: 1.以这个点为根,那么所有的子树(不算整个树自身)的大小都不超过整个树大小的一半. 2.假设两个联通块x和y进行合并,而且\(size(x)>size(…
原题地址:https://www.luogu.org/problemnew/show/P3950 题目简述 给定一棵树,每次给定一个操作,有如下两种: 将某条边染黑 2.询问给定的u,v两点间是否有边被染黑 思路 询问两点间是否有边被染黑只需要在求LCA时判一下就行.所以直接上树链剖分即可. 本题不需要使用线段树,使用树状数组查询路径上是否有任意一段区间和不为0即可. 代码 #include <bits/stdc++.h> #define lowbit(x) x&-x using na…
点此看题面 大致题意: 给你一棵树,\(3\)种操作:连一条边,删一条边,询问两点是否联通. \(LCT\)维护连通性 有一道类似的题目:[BZOJ2049][SDOI2008] Cave 洞穴勘测. 这两道题都是\(LCT\)动态维护连通性的模板题. 考虑将\(x\)和\(y\)连边时,我们就在\(LCT\)上\(Link(x,y)\). 同理,\(x\)和\(y\)断边时,就\(Cut(x,y)\). 询问连通性时,只要判断\(FindRoot(x)\)与\(FindRoot(y)\)是否相…
点此看题面 大致题意: 有\(n\)个洞穴,\(3\)种操作:连一条边,删一条边,询问两点是否联通. \(LCT\)维护连通性 这道题应该是\(LCT\)动态维护连通性的一道模板题. 考虑将\(x\)和\(y\)连边时,我们就在\(LCT\)上\(Link(x,y)\). 同理,\(x\)和\(y\)断边时,就\(Cut(x,y)\). 询问连通性时,只要判断\(FindRoot(x)\)与\(FindRoot(y)\)是否相等即可. 代码 #include<bits/stdc++.h> #d…
题面 传送门:https://www.luogu.org/problemnew/show/P2147 Solution 这题...... 我们可以发现题目要求我们维护一个动态森林,而且只查询连通性.... 显然LCT模板题啊,关于LCT玩法,可以猛戳这里学习 Code #include<iostream> #include<cstdio> #include<vector> using namespace std; long long read() { long long…
题目描述 原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突.几乎每个居民都有他的仇敌.部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何2 个人都不是仇敌. 给定byteland部落中居民间的仇敌关系,编程计算组成部落卫队的最佳方案. 输入输出格式 输入格式: 第1行有2个正整数n和m,表示byteland部落中有n个居民,居民间有m个仇敌关系.居民编号为1,2,…,n.接下来的m行中,每行有2个正整数u和v,表示居民u与居民v是仇敌.…
P1692 部落卫队 题目描述 原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突.几乎每个居民都有他的仇敌.部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何2 个人都不是仇敌. 给定byteland部落中居民间的仇敌关系,编程计算组成部落卫队的最佳方案. 输入输出格式 输入格式: 第1行有2个正整数n和m,表示byteland部落中有n个居民,居民间有m个仇敌关系.居民编号为1,2,…,n.接下来的m行中,每行有2个正整数u和v,表示居…
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. 输入输出格式 输入格式: 第一行两个整数N和P(1≤P≤1000000000).第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N).第三行有一个整…
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…
直接把x设为根,然后查询y所在联通块的根是不是x就行了. CODE #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; template<typename T>inline void read(T &num) { char ch; int flg = 1; while((ch=getchar())<…
这可真是道神仙题QWQ问了好多\(dalao\)才稍微明白了一丢丢做法 首先,我们假设不存在\(1\)操作,那么对于询问的一段区间中的所有的树,他们的形态应该是一样的 甚至可以直接理解为\(0\)操作就是表示所有树的生成节点都添加一个儿子 其实就算存在\(1\)操作,也是类似同理的. 这样考虑: 考虑如果在 \(l\)处更换了生长节点,那么就相当于把第 \(l−1\) 棵树之后生长的节点都"嫁接"在这个新的生长节点上.我们可以想象对于每一个\(1\)操作建一个虚点,然后0操作生长的点都…
洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2......(相信各位Dalao一定做过这道题) 这里的维护懒标记方法很像.除了翻转标记以外还要维护乘法标记和加法标记. 根据运算优先级,乘法是要先算的,所以先放,放的时候子树的\(sum\),乘法标记,加法标记,儿子的\(val\)统统都要乘一遍. 放加法标记的时候,想到线段树的区间大小是稳定的,而Splay…
洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环么? 于是,一个森林的模型被我们建出来了. 考虑到有修改弹力值的操作,也就是要断边和连边,于是用LCT维护. 思路一 每一个点向它弹到的位置连边.如果被弹飞了,那么这条边就不存在. 查询弹飞的步数,就是查询该点到其所属原树中根节点的路径的\(size\). 注意此题的一些特性.我们并不需要查询或者更…
洛谷题目传送门 思路分析 维护子树最值还是第一次写QwQ 因为子树的最值会变化,所以不能简单地把最值记下来,还要维护一个平衡树,把每个子树的最大值扔进去,来资磁插入.删除和查询最值. 然后我就懒得手写了,毕竟Splay作为平衡树时与LCT中的Splay写法不一样,不能混用. 于是要去学习STL啦 非常感谢Kelin巨佬的代码,我终于初步掌握了一下set的用法 (比如说知道了multiset的erase某值是把所有等于该值的节点删除......) (还比如说知道了rbegin和end的区别....…
题目链接 洛谷P3676 题解 我们先维护\(1\)为根的答案,再考虑换根 一开始的答案可以\(O(n)\)计算出来 考虑修改,记\(s[u]\)表示\(u\)为根的子树的权值和 当\(u\)节点产生\(v\)的增量时,只影响\(1\)到\(u\)路径上的\(s\),权值和都\(+v\) 而对答案的影响是 \[ \begin{aligned} \Delta ans &= \sum\limits_{i}^{k}(s_i + v)^{2} - \sum\limits_{i = 1}^{k} s_i^…
点此看题面 大致题意: 有一棵初始边权全为\(1\)的树,四种操作:将两点间路径边权都加上一个数,删一条边.加一条新边,将两点间路径边权都加上一个数,询问两点间路径权值和. 序列版 这道题有一个序列版:[洛谷3373][模板]线段树 2. 看题目就知道是一道线段树板子题. 这种题目移到树上路径中,且要删边加边,是\(LCT\)无疑了. \(LCT\)维护懒惰标记 可以说,这道题就是上面那题的翻版. 同样维护两个标记:乘法标记和加法标记,加上原有的翻转标记,共三个标记. 具体细节其实可以详见上面提…
QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i\)的虚子树的子树和,然后维护\(sum[i]\)表示\(i\)的虚+实子树之和. 那么对于一个点\(x\),他在原树上的字数大小就应该是$$size = xv[x]+sum[ch[x][1]]+1$$ 这是个经典套路! 对于这个题来说,我们可以通过\(split(x,y)\),然后\(ans\)就…
这也是一道LCT维护生成树的题. 那么我们还是按照套路,先对边进行排序,然后顺次加入. 不过和别的题有所不同的是: 在本题中,我们需要保证LCT中正好有\(n-1\)条边的时候,才能更新\(ans\) 其次,更新答案的时候,已知我们的边是最小的边,所以我们要考虑删除最大的边来考虑更新答案,而求最大边的过程,可以通过\(vis\)打标记,加一个指针随时维护来解决 最后一件事!!!!!! 一定记得判断自环!!!!!!!! for (int i=1;i<=m;i++) { int x=a[i].x,y…
本题是运用LCT来维护一个最小生成树. 是一个经典的套路 题目中求的是一个\(max(a_i)+max(b_i)\)尽可能小的路径. 那么这种的一个套路就是,先按照一维来排序,然后用LCT维护另一维 那么这个对于这个题来说,我们考虑,可以先按照a从小到大排序,然后顺次加入每条边,这样每次加入的边一定是有可能会更新到\(ans\)的. 对于一条边\(u->v\),如果\(u\)和\(v\)不在一个联通块里面的话,那么就直接连上这个边,然后尝试更新答案 如果在同一个联通块里面呢,我们就判断\(u\)…
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小生成树弄出来,因为要求次小生成树.至于为什么次小一定只在最小的基础上改变了一条边,我也不会严谨的证明......打表找规律大法好 剩下的可以有一堆数据结构来维护最大值和次大值(原理两位巨佬都讲清楚了,这里只分析一下算法的优劣) kruscal+倍增+LCA 山楠巨佬的做法,我也写了这一种.复杂度\(…
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类对树的边进行轻重划分的操作,这样做的目的是为了减少某些链上的修改.查询等操作的复杂度. 目前总共有三类:重链剖分,实链剖分和并不常见的长链剖分 重链剖分 实际上我们经常讲的树剖,就是重链剖分的常用称呼. 对于每个点,选择最大的子树,将这条连边划分为重边,而连向其他子树的边划分为轻边. 若干重边连接在…
洛谷题目传送门 ZJOI的考场上最弱外省选手T2 10分成功滚粗...... 首先要想到30分的结论 说实话Day1前几天刚刚刚掉了SDOI2017的树点涂色,考场上也想到了这一点 想到了又有什么用?反正想不到最大的贡献是怎么推出来的 然后晚上心中怀着九条CNM看完了Solution.pdf 貌似对我这个蒟蒻来说也只有这一题可做了...... 已知书上每个点access的总次数,构造出一个顺序,最大化虚实边的切换总次数 其实如果能发现最优顺序的构造是没有后效性的话,问题便可以进一步简化 考虑每个…