trees
trees
lamentropetion
---
展开
-
【换根DP】CF1882 D
然后就可以直接换根了,首先考虑树形DP,设dp[u] 为 把 u 子树染成同一种颜色的最小代价。首先观察到,先对儿子一定比先对父亲操作来的代价小,因此考虑先对儿子操作,再对父亲操作。那么根据刚刚的先操作儿子,转移方程为。然后换根就正常换就好了。原创 2023-10-21 16:20:41 · 179 阅读 · 0 评论 -
【前后缀技巧】2022牛客多校3 A
预处理出前缀lca和后缀lca,枚举哪个消失即可,可以统计方案数。这种是典中典中典,对于gcd,背包问题都是一样的处理方式。原创 2023-10-05 00:58:31 · 442 阅读 · 0 评论 -
(枚举 + 树上倍增)Codeforces Round 900 (Div. 3) G
首先,目标值和结点权值是直接联系的,最值不可能直接贪心,一定是考虑去枚举一些东西,依靠这种枚举可以遍历所有的有效情况,关于怎么跳其实可以参考树上倍增往上跳的跳法,记录一个数组指向下一个结点,在dfs上维护即可,有点像在树链上DP。如果考虑在链上枚举,如果前缀或值不变,那么这样的枚举是无效的,我们直接考虑跳着枚举,只枚举所有。注意到一条路径上的前缀或值不会超过 logV个,因此考虑枚举前缀或值。如果去直接在链上枚举的话, 复杂度是O(nq),肯定不行。关于每次跳使前缀或值变化的最深的点,我是这样理解的。原创 2023-10-03 23:23:14 · 350 阅读 · 0 评论 -
【树DP】2021ICPC南京 H
然后考虑不存在tv = 3的结点,那么就是一次性走到底,再去遍历其他结点,此时贡献为 sum[u] + mx,其中 mx 为所有子节点中最大的 a[v]注意到,对于一个结点 u ,如果它的所有子节点中没有 tv = 3的,那么就肯定是沿着一棵子树走到底,然后去走剩下的子树。因为怎么转移和这些子节点中是否存在 tv = 3的结点有关,那么考虑先去把这些结点遍历一遍,看看是否存在,然后去转移。如果所有子节点中有 tv = 3的,那么可以先走到某个子节点,然后再走到这个 tv = 3的结点。原创 2023-08-30 21:52:15 · 139 阅读 · 0 评论 -
【二分+贪心】CF1665 C
我们可以结点按照兄弟的数量排序,然后优先感染兄弟多的结点.这样我们就知道了,第一秒被。个兄弟,所以我们扫描一遍就可以知道还剩下多少个兄弟结点还没被感染,判断能否用剩下的。但是可能会有别的分量更大(因为最后给最大的染色之后可能不再是最大的)一定用于优先感染兄弟结点比较多的结点,这样可以充分利用。只想到先感染大的分量,然后最后把最大的分量剩下的染色。可以用堆维护,但是这里用二分做法。的操作将这些结点感染即可.的结点剩下的时间里可以被。一开始想太简单wa6了。秒内能否感染所有结点.个兄弟,第二秒可以被。原创 2023-08-11 20:28:30 · 310 阅读 · 0 评论 -
【树形DP+换根思想】2022牛客多校加赛 H
为什么要这么设计,我们发现,如果计算的结点是在子树里面的,那么lca就是u,子树的贡献直接就是sz[u]*cnt[u][0/1]首先,后缀0的个数可以转化成min(cnt2,cnt5),其中cnt2为2的因子个数,cnt5为5的因子个数。最后统计贡献的时候加上子树部分的贡献,取min(cnt2,cnt5)就好了。设dp[u][0/1]为,在除了u这棵子树中,2/5的因子个数。但是在这棵子树之外的贡献不能这么求,因此需要额外设计。这个虽然是树形DP,却用了换根的思想....原创 2023-08-02 19:33:28 · 497 阅读 · 0 评论 -
【枚举边+树的直径】CF14D
两条链不相交,说明是在不同连通分量中,我们可以枚举边来把树分为两个连通分量,然后分别计算直径即可。原创 2023-08-02 14:24:49 · 196 阅读 · 0 评论 -
【长链剖分】icpc 2022西安 L
【代码】【长链剖分】icpc 2022西安 L。原创 2023-08-01 09:57:12 · 220 阅读 · 0 评论 -
【树链剖分+MST】CF609E
先把全局的MST求出来,然后对于一条边,如果它本来就在MST中,说明代价就是MST的权值和,否则它加入MST中,此时MST形成了环,我们把环中最大的那条边删掉,就相当于用这条边换掉了环中最大边,这样就是最小权值和。那么怎么求环中最大边,直接树剖即可。原创 2023-07-30 00:20:24 · 150 阅读 · 0 评论 -
【换根DP】Subtree
【代码】【换根DP】Subtree。原创 2023-07-28 23:50:27 · 228 阅读 · 0 评论 -
【树上乘法原理】ICPC Shanghai 2021 G, Edge Groups
手摸一下样例发现,对于一棵子树,若边数为偶数,那么可以内部匹配,但是如果边数为奇数,那么就一定需要u和fa那条边和子树的边匹配。若多出来K条边,由乘法原理知道,方案数为(K-1)*(K-3)*....如果边数还为奇数,那么就和u和fa这条边匹配。求方案数,考虑组合数学。将多出来的边进行匹配。原创 2023-07-27 23:03:40 · 138 阅读 · 0 评论 -
【树上点对问题】Tree Problem
如果关注的是路径经过边,那么就考虑一条边两端的连通分量。对于树上的一对点,我们往往考虑更换枚举对象。如果关注的是路径经过点,那么分成两部分考虑。另一部分是子树整体和上子树的贡献。一部分是这个点的子树之间的贡献。原创 2023-07-27 14:58:17 · 174 阅读 · 0 评论 -
【*1800树上贪心】CF1401 D
按照CF惯用套路,这样的n^2贡献肯定是更换枚举对象,我们去枚举边,按边算贡献。首先,1尽可能少,那就是让pi尽可能不合并地摊到所有边上,然后计算贡献。对于一条边的贡献应该为sz[u]*(N-sz[u])*p[i]然后就是贪心了,大的边权摊到经过次数多的边,小边权到次数小的边。同时需要分类讨论这些给定的质因子个数和边数的大小关系。原创 2023-07-26 19:44:22 · 100 阅读 · 0 评论 -
【树上操作】定长裁剪 CF1833 G
如果可以,第一行返回减掉边的数量,第二行返回减掉边的编号;给定一棵n个节点的树,请你减掉一些边,使得剪掉后的每个树只有三个节点,可以发现我们可以从叶子结点递归裁剪。原创 2023-07-23 21:11:04 · 235 阅读 · 0 评论 -
【*2000 暴力树形DP】CF1230 E
【代码】【*2000 暴力树形DP】CF1230 E。原创 2023-07-11 22:23:04 · 116 阅读 · 0 评论 -
【dfs序+树上差分】ABC309 E
不同的是是对一部分子树操作,因此对于离子树根结点d+1距离的在子树内的结点进行减操作。至于如何判断一个点是否在子树内,只需求出dfs序即可。这里lca判断会多个log,会超时。对子树进行操作,就可以树上差分。然后做一次前缀和就行。原创 2023-07-10 13:59:43 · 263 阅读 · 0 评论 -
代码源树上背包 板子
因为u整棵树选的点数恰好为m,我们去枚举v这棵子树中选的点数,和前面遍历的这些多棵子树的选的点数,把结果存到tmp数组里,然后再用tmp数组给dp赋值。注意这里的sz数组,因为我们在遍历“物品”的时候,是不包含u这个结点的,因此sz一开始为0而不是1,等到所有物品遍历完之后,再算上u这个结点。树上背包在合并时这么多个子树中点对之间只有1的贡献,每对点对只会在它们的lca处有贡献,所以是n^2的。做法是在dfs序上做背包,如果不选,就是跳过这棵子树,选就从i+1的时间戳转移过来。这是标准的树上背包问题。原创 2023-06-19 15:14:33 · 129 阅读 · 0 评论 -
【换根DP】CF1324F
初始化就是:如果u本身是黑,那dp[u]=-1,否则dp[u]=1。设dp[u]为以u为根的子树中白-黑的最大值。事实上,S2很难求,根本不需要去求它。因此只需要把dp[v]分类讨论即可。先去树形DP求出DP值,这很好求。原创 2023-06-18 23:16:44 · 89 阅读 · 0 评论 -
【*1900 换根DP】CF1092F
然后考虑换根,可以注意到u子树部分深度加1,v子树部分深度-1,因此方程就是dp[v]=dp[u]+sum-sz[v]-sz[v]如果要直观算贡献,一般是将u子树去掉v的那部分和v子树分开来考虑变化量。如果实在想不清楚,可以手推样例:(这里是样例1)设dp[u]为在以u为根的子树上,所有点的贡献。感觉很简单,根本没有1900的难度。首先先树形DP,然后dfs换根。原创 2023-06-18 22:28:02 · 66 阅读 · 0 评论 -
【换根DP】生活在树上
是根据u结点的dp值和v的dp值更新儿子结点的dp2值,即dp2[v]=...dp[u]+....的形式。看数据范围是1e6且是统计问题,求的是对于每一个点的统计问题,那就逃不出是换根DP了。设dp[u][j]为以u为根的子树中,离根u的距离是j的结点个数。然后考虑换根,换根的时候注意是从上到下更新dp数组。首先dfs1一次把树形DP求出来,然后再考虑换根。这个很容易转移,但是注意要对边权分类讨论。原创 2023-06-18 20:50:08 · 70 阅读 · 0 评论 -
【树形DP+可重集排列】至至子的公司排队
关于计数类的树形DP,都可以把一棵子树的所有状态想象成一列,然后多棵子树进行匹配(乘法原理)先是乘法原理把所有儿子的dp值乘起来,然后注意到对于同一棵子树的拓扑序而言,顺序是确定的,那么森林的方案数怎么求呢?其实就是把这么多棵树看作子树,再求一下可重集排列即可。设dp[u]为,以u为根的子树的拓扑序的种类数,然后去考虑它的子树。其实题目问的就是,森林的拓扑序有几种。那么我们先去考虑一棵树的拓扑序有几种。这点很重要,我根本没想到这点qwq。这个可以用树形DP来解决。原创 2023-06-18 11:59:39 · 617 阅读 · 0 评论 -
【树形DP+直径思想】代码源每日一题div1 三进制循环
回顾一下我们是怎么求直径的:维护根节点到其子树上的点的最大距离和次大距离,然后答案就是统计所有结点的次大值+最大值 的 最大值。注意到在统计答案的时候,需要统计从左到右的链的最大值,也要统计从右到左的链的最大值。设dp[u][0]为,u到以u为根节点的子树中的往上走的路径的长度最大值。如果是向上走的路径,判断一下(a[v]+1)%3+1=a[u]是否成立。如果是向下走的路径,判断一下a[v]=(a[u]+1)%3+1是否成立。dp[u][1]为u到以u为根节点的子树中的往下走的路径的长度最大值。原创 2023-06-11 19:37:45 · 243 阅读 · 0 评论 -
【树上计数 乘法原理】ABC129 E - Virus Tree 2
第二个想法是容斥,先算出所有涂色方案是K^N,然后减去存在d=1的同色的,再减去d=2的同色的,然后加上d=1且d=2的同色的,然后发现这好像更难算了。可以发现,深度为1的方案数是K,深度为2的方案数是K-1,其他的深度的最左边的点都是K-2,然后方案数随着从左到右递减。一开始很自然地想到了树形计数DP,但是很不幸,N,K<=1e5,爆空间了,因此考虑组合计数。然后就不会了,事实上,模拟一下第二个样例就会发现,这个就是乘法原理而已。所以可以直接乘法原理了。原创 2023-06-09 11:15:10 · 55 阅读 · 0 评论 -
【树上染色】ABC146 D
如果是给边染色,这个col代表的就是该点u到其父节点的边的颜色,给边染色需要给边加一个属性id,方便记录答案。给定一棵树,让你给这棵树的边染色,使得对于一个结点,与其相邻的所有边的颜色都不一样,要求颜色种数要最少。一般树上染色问题是周期性的染色,那么颜色就是(++idx)%T。如果是给点染色,这个col代表的是给该点染成col。染色的时候dfs要加参数col。分为给点染色或者给边染色。原创 2023-06-07 23:46:00 · 107 阅读 · 0 评论 -
【dfs序+二分】ABC202 E Count Descendants
先预处理出每个结点的入序和出序,对于每一次询问,查询在深度d的所有结点中dfs序在[In[u],Out[u]]之间的结点个数即可,所以我们需要预处理出对于每个深度,这个深度的所有结点的dfs序,把它们放进vector就好了。一开始的想法是,树形DP预处理出在子树u中,离结点u距离为j的结点个数,然后直接输出答案。原创 2023-06-06 20:49:17 · 91 阅读 · 0 评论 -
【树上染色】CF1760G
我们需要找到一个点,使得a点到x点的路径异或和=x点到b点的路径异或和,这样总的异或就是0了。所以考虑树上染色,先从a点染异或值,再从b点染。树上染色的颜色一般写在dfs的参数里。原创 2023-06-01 16:05:57 · 67 阅读 · 0 评论 -
【树上染色】ABC303E
若干菊花图连在一起,每个菊花图的中心之间的距离都是2。因此我们可以给这棵由菊花图构成的树编号,即进行染色。原创 2023-05-31 23:38:10 · 62 阅读 · 0 评论 -
【Tree树上染色+贪心】CF1387B1
当N为奇数时,对于多出来的三个点,三个之间交换即可。但其实也不难写,只需要树上染色然后维护答案就行了。事实上就是这么做的,但是看起来比较难写。当N为偶数时,其实就是相邻两个点交换。原创 2023-05-31 23:19:24 · 39 阅读 · 0 评论 -
【构造+数论+Tree树上染色】CF1627C
如果出的简单一点,那就是手推样例,直接模仿样例给的构造,或者直接最特殊的情况,这种最特殊的情况就算全部猜一遍也能猜出来。一开始模拟了一下样例,Sample3告诉我们如果有三条边相邻就是无解(可以猜的结论)给定一棵树的形态,让你给这棵树的边赋值,使得每对相邻的边的边权和都是质数。然后不知道该怎么具体赋值,不知道该怎么特殊化边权。事实上,只需要2,3,2,3这样子赋值即可。难的我也不懂,还没写过难的构造题。感觉2000分以下的构造。原创 2023-05-31 14:05:17 · 104 阅读 · 0 评论 -
【Tree+贪心】CF1336A
【代码】【Tree+贪心】CF1336A。原创 2023-05-30 18:06:45 · 33 阅读 · 0 评论 -
【*2000 树形DP】 CF533B
dp[u][0/1]:以u为根的子树中,已选的人数的奇偶性为偶or奇的最大权值。因为n<=1e5,因此不可能把第二维开成:子树中已选的人数,应该表示奇偶性。注意,树形DP转移方程一定是对于其中一棵子树而言的(比如第i棵子树)原创 2023-05-29 17:54:09 · 75 阅读 · 0 评论 -
【*1900 DP+Tree】CF9D
dp[i-1][j]为树高是i-1(去掉第一层),总结点数是j的方案数,此时这个DP数组的主体就是根节点的两棵子树。如果我们按照最后一层,即都是叶子结点的那一层来转移,发现根本不知道怎么算贡献。如果我们按照最上面那一层转移,就会发现,转移的过程中,DP的主体就是子树。dp[i][j]为树高是i,总结点数是j的方案数,主体是整棵树。设dp[i][j]表示树高为i,结点数<=j的方案数。因为它是二叉树,比较特殊,所以可以考虑一下线性DP。它其实就是按照树高为阶段的DP。计数问题,考虑计数DP。原创 2023-05-29 12:57:10 · 449 阅读 · 0 评论 -
【LCA+树上距离+手推样例观察结论】CF1304 E. 1-Trees and Queries
a到b原来的路径长度是固定的,因此如果原来的长度D!=K,那就必须要通过新加的边了。但是突然注意到题目还有一个条件:边可以重复走。那就是求出新加边之后a到b的距离。树上加一条边,那就是个基环树。原创 2023-05-27 17:13:05 · 51 阅读 · 0 评论 -
【LCA】P4281 [AHOI2008]紧急集合 / 聚会
手推一下样例发现该点去三个LCA中深度最深的那个点。原创 2023-05-27 15:59:22 · 79 阅读 · 0 评论 -
【树上差分+LCA】篮球杯 砍树
s[u]==M时,与该点连着的边就是合法边了,统计合法边的最大id就行。这条边两端的结点的经过次数==M。因此每加一个点对,都对其路径+1。考虑一条边,两端有两棵子树。原创 2023-05-27 15:55:17 · 61 阅读 · 0 评论 -
【树上背包】选课
才知道原来树上背包的状态表示里一直是滚动了一维,怪不得之前怎么看都觉得很奇怪。注意,因为滚动了一维,所以j需要倒着枚举。这下看起来和普通背包没区别了。滚动的是【前i个子树】这下终于懂树上背包了。原创 2023-05-25 21:24:21 · 45 阅读 · 0 评论 -
【换根DP】CF1187E Tree Painting
即在上图中结点 j 的贡献能不能用 j 子树除去 i 子树的部分(用已经算出来的f数组表示)和i部分的子树(不能用f数组表示,因为fi表示的子树包括了i现在的父亲),当然有时候可以用容斥,大部分情况是用其他参数表示(参考f数组的转移方式)然后在考虑换根的时候,因为以1作为根的答案f已经算出来了,换根之后,根据刚刚的转移方式,看看v的父节点u部分的去掉v的子树的新子树能不能用u的儿子和其他参数表示。在考虑换根DP的时候,先把以1为根的答案求出来,即先把fi求出来,这个时候就用普通的树形DP求,原创 2023-05-25 20:29:15 · 68 阅读 · 0 评论 -
【树形DP】ABC259 F - Select Edges
如果状态设成dp[u][j]表示以u为根的子树,子树中选j条边的最大权值和 的话,会爆空间,因此树上背包是不可以的。因为儿子的顺序是无关紧要的,因此可以将儿子按贡献大小排序选,把最大权值和作为dp[u][1]的状态。注意到每条边都有选和不选两种决策,因此可以把决策放在状态里面。这里的贪心也有点难想到。边的状态可以转化到点里。原创 2023-05-25 17:17:36 · 99 阅读 · 0 评论 -
【树上差分】[JLOI2014] 松鼠的新家
裸的树上差分,给单点打标记,最后求个后缀和就行。给u到v的路径中的所有结点都+val。原创 2023-05-24 21:06:33 · 65 阅读 · 0 评论 -
【树上倍增】CF294 div2 E A and B and Lecture Rooms
如果dep[u]==dep[v],那么如下图所示的结点x和结点y所在子树之外的所有结点都满足条件(图画的比较抽象qwq)给定一棵树和两个结点u和v,每次询问问整棵树上离u和v的距离一样的结点个数是多少。满足条件的就是uu这棵子树除去vv这颗子树的大小。先把u到v的路径中到u和v距离一样的点找出来:uu。如果u==v,那么整棵树都满足条件。vv是uu下面的那个结点。对u和v分类讨论即可。原创 2023-05-24 16:29:18 · 36 阅读 · 0 评论