随笔分类 -  树论

摘要:VIII.[ZJOI2015]幻想乡战略游戏 题意:求一个树的带权重心,带修改。 现在首位的题解的方法太恶心了,这里介绍我自己的理解。 假设重心为$x$,我们有它的代价为: \(\sum\limits_{i=1}^{n}\operatorname{dis}(i,x)\times val_i\) 其中 阅读全文
posted @ 2021-04-01 12:52 Troverld 阅读(141) 评论(0) 推荐(1)
摘要:VII.[HNOI2015]开店 首先,第一种方法便是动态点分治。 我们先考虑忽略年龄限制的情形。 我们考虑正常求一个点到另一个点的距离应该怎么求—— 一般来说,我们会用$dis(i,j)=dep_i+dep_j-2*dep_{lca(i,j)}$对吧? 这个东西相当于将路径划分成两个部分,其中每个 阅读全文
posted @ 2021-04-01 12:49 Troverld 阅读(80) 评论(0) 推荐(0)
摘要:V.[FJOI2014]最短路径树问题 这题已经在我的收藏夹里吃了大半年的灰了……主要是因为他们有人把这题归到了树形DP里面,然后我就傻乎乎地把它收藏了…… 首先,假设我们已经求出了这个“最短路径树”,剩下的就是点分治的板子了。 而这个“最短路径树”,首先可以通过Dijkstra跑出最短路径DAG, 阅读全文
posted @ 2021-04-01 12:37 Troverld 阅读(89) 评论(0) 推荐(0)
摘要:IV.树上游戏 考虑淀粉质。 对于一棵分治树,我们考虑对树中所有LCA为根节点的路径计算贡献。 我们对于根节点一棵子树一棵子树地处理。设$cnt_i$表示子树外有多少条以根节点为一个端点的路径上有颜色\(i\)。则我们当前子树中的一个点的贡献可以分作两部分:子树外的部分(即$\sum cnt_i$) 阅读全文
posted @ 2021-04-01 12:34 Troverld 阅读(89) 评论(0) 推荐(0)
摘要:III.BZOJ3784: 树上的路径 思路1: 淀粉质。用priority_queue维护前$m$长的路径的长度。用multiset维护点分治时,之前所有子树的路径长度,然后对于新子树中的每一条路径,在multiset中从大往小枚举另一半路径拼一起并尝试加入优先队列。如果加入失败,那么对于这个点, 阅读全文
posted @ 2021-04-01 12:33 Troverld 阅读(63) 评论(0) 推荐(0)
摘要:I.[IOI2011]Race 思路:弱智淀粉质题。唯一缺点就是卡常,卡的要死要活。 具体来说,只需要开出桶来(因为$m$最大只到$10^6$,因此直接处理长度$\leq m$的路径存入桶中求$\min$即可。 代码: #include<bits/stdc++.h> using namespace 阅读全文
posted @ 2021-04-01 12:30 Troverld 阅读(57) 评论(0) 推荐(0)
摘要:XV.CF1073G Yet Another LCP Problem 这里记录一下我在思考本题时的一个感悟,即后缀数组与后缀自动机的等价性。 众所周知,SA时有一个常见思路就是针对 height 数组建一棵笛卡尔树。但是,该笛卡尔树,唯一等价于SA针对的串的反串的parent tree。具体可以分别 阅读全文
posted @ 2021-04-01 12:15 Troverld 阅读(96) 评论(0) 推荐(0)
摘要:XXXV.树上后缀排序 My Solution 阅读全文
posted @ 2021-04-01 11:23 Troverld 阅读(42) 评论(0) 推荐(0)
摘要:XII.[TJOI2015]弦论 题解 阅读全文
posted @ 2021-04-01 10:36 Troverld 阅读(45) 评论(0) 推荐(0)
摘要:Prufer序列是一种神奇的东西,其可以实现无根树与序列间的双射,并且在计数题、DP题、找规律题等等问题中有着不俗的表现。 (另,大部分时候,Prufer及其误拼Purfer、Purfur、Prefer等奇奇怪怪的变体是被混用了的) 首先,一棵 \(n\) 个节点的树的Prufer序列,是一长度为 阅读全文
posted @ 2021-03-31 16:46 Troverld 阅读(229) 评论(0) 推荐(0)
摘要:这里是矩阵树定理学习笔记。线性代数基础详见线性代数学习笔记。 矩阵树定理是用来作生成树计数的好东西。其定理主要表述如下: 设 \(\mathbb{G}\) 为一无向图。则其无向无根生成树的数量,可以被如下算法求得: 设矩阵 \(S_1\),其中第 \(i\) 行第 \(j\) 列的数是 \((i,j 阅读全文
posted @ 2021-03-31 16:44 Troverld 阅读(222) 评论(0) 推荐(0)
摘要:XX.SP16549 QTREE6 - Query on a tree VI 本题LCT全方面爆破树剖——无论是复杂度、码量、思维难度、代码难度,全都碾压树剖。并且,LCT容易模板化,但是树剖不容易——树剖搭配的线段树因题而异,而LCT只需要把$pushup$和$pushdown$稍微改改就可以直接 阅读全文
posted @ 2021-03-31 16:27 Troverld 阅读(85) 评论(0) 推荐(0)
摘要:XIX.首都 一句话题意:维护一棵森林,支持查询某棵树的重心以及所有树的重心的异或和。 众所周知,重心有如下性质:将两棵树之间连一条边后,新树的重心在原两棵树重心的连线上。 根据这一性质,我想了半天也没有想出来什么美妙的算法主要还是我splay没学好 首先,这道题正解有两个,一是LCT+启发式合并( 阅读全文
posted @ 2021-03-31 16:24 Troverld 阅读(72) 评论(0) 推荐(0)
摘要:XVII.[SDOI2017]树点涂色 树剖和LCT学到最后实际上是殊途同归的……就比如说这题,可以用树剖,但是在操作$1$中借鉴了LCT的跳链思想;LCT则因为不能子树修改,按照dfs序需要建出线段树出来,实际上也就是树剖的思想了。 首先讲一下LCT写法。观察到任意时刻,任意一种颜色一定是一条深度 阅读全文
posted @ 2021-03-31 16:21 Troverld 阅读(82) 评论(0) 推荐(0)
摘要:XV.[USACO18FEB]New Barns P 这种东西应该怎么维护呢?这是子树最大值呀。 一种方法是用平衡树(例如 std::multiset )维护轻儿子长度集合。但是这种东西太麻烦,太恶心了。 考虑直径的性质。我们给出两条引理: 引理1:假如有一条直径$(p,q)$,那么树中任意一个点$ 阅读全文
posted @ 2021-03-31 16:17 Troverld 阅读(354) 评论(0) 推荐(0)
摘要:VII.[SHOI2014]三叉神经树 LCT相较于树剖,最大的优势就是可以把一条链上的东西全整到一个splay里面,不像树剖在多个重链进行合并时会有很大麻烦。更好的是,LCT复杂度是$O(n\log n)$的,树剖不仅码量大,思路复杂,复杂度还是恶心的$O(n\log^2n)$。 这题就是典型的树 阅读全文
posted @ 2021-03-31 16:00 Troverld 阅读(116) 评论(0) 推荐(0)
摘要:CLIII.[SDOI2017]切树游戏 设 \(f_{x,0,i}\) 表示 \(x\) 子树中,所有包含 \(x\) 且异或和为 \(i\) 的连通块数量,\(f_{x,1,i}\) 表示 \(x\) 子树中异或和为 \(i\) 的连通块数量。显然,有公式 \(f_{x,1,i}=f_{x,0, 阅读全文
posted @ 2021-03-31 15:38 Troverld 阅读(88) 评论(0) 推荐(0)
摘要:CLII.【模板】"动态 DP"&动态树分治 裸的树上最大独立集怎么做?设 \(f_{x,0}\) 表示在 \(x\) 子树中, \(x\) 不选的最大答案;\(f_{x,1}\) 表示在 \(x\) 子树中,\(x\) 选的最大答案。则有 \(f_{x,0}=\sum\limits_{y\in\t 阅读全文
posted @ 2021-03-31 15:37 Troverld 阅读(63) 评论(0) 推荐(0)
摘要:CXXXI.[GYM102331J]Jiry Matchings 首先,不难想到一个 \(O(n^2)\) 的树上背包:设 \(f_{i,0/1,j}\) 表示在以 \(i\) 为根的子树内,其中 \(i\) 没有被匹配/被匹配了,且整个子树中共匹配了 \(j\) 条边的最优方案。考虑优化。 我们知 阅读全文
posted @ 2021-03-31 15:02 Troverld 阅读(553) 评论(1) 推荐(1)
摘要:CX.[POI2015]MOD 比较恶心的题目。 首先,有一个结论,即如果把两棵树通过某种方式连接起来,新树的直径的端点一定来自于原本两棵树的直径端点集合。 则考虑新树的最大直径,明显就是把两棵树的直径直接连一块,就是两棵树的直径之和再加一。 考虑新树的最小直径,则应该选择两树直径的中点(如果直径长 阅读全文
posted @ 2021-03-31 14:23 Troverld 阅读(57) 评论(0) 推荐(0)