随笔分类 - 树论
摘要:"题目" 首先考虑二分,然后发现最小长度越大的话,赛道就越少。所以可以用最终的赛道个数来判断长度是否合理。问题转化为给定一个长度,问最多有多少条互不重叠路径比这个给定长度大。 考虑贪心,毕竟贪心也是二分check函数的常用做法。原图毕竟为一棵树,每条路径都由一个端点一个终点和他们的之间的连
阅读全文
摘要:"题目" 树链剖分 安装操作: 将1到x的点权统统_覆盖_为1,操作前覆盖一次,操作后覆盖一次。然后分别记录这两次1到x的路径点权和,求他们的差即是答案。 卸载操作: 输出x的子树点权值和,然后把x的子树点权统统_覆盖_为0。 覆盖操作可以用ODT,线段树,线段树的lazy数组初始值要赋为 1,因为
阅读全文
摘要:"题目" 树链剖分或者树上差分 树链剖分只能对点进行操作,所以把边权化为点权。树上化边权为点权的一般操作是把边权赋到深度较深的点里。 然后用树链剖分+线段树更改权值路径和+单点查询即可解决该问题。
阅读全文
摘要:"题目" 细节比较多的二分+跟LCA倍增差不多的思想 首先有这样一个贪心思路,深度越低的检查点越好,而最长时间和深度具有单调性,即给定时间越长,每个军队能向更浅的地方放置检查点。因此可以考虑二分时间,然后判断军队是否可以放置在控制疫情的地方。 但是有的军队需要先满足自己当前所在的节点,然后此节点如果
阅读全文
摘要:"题目" 树上差分 树上点差分,注意会出现路径端点多记录的情况,这时需要在最后输出的时候输出子树的差分数组的和 1,而不是在处理原数据的时候减1。并且a[n]不需要糖果,最后也减去就行。 c++ include define N 1001011 using namespace std; struct
阅读全文
摘要:"题目" 题目要求使一条边边权为0时,m条路径的长度最大值的最小值。 考虑二分此长度最大值 首先需要用lca求出树上两点间的路径长度。然后取所有比mid大的路径的交集,判断有哪些边在这些路径上都有出现,然后这些边里面取最大值当做虫洞,如果还是不行说明此mid不行。 判断边可以用把边化为点,然后树上差
阅读全文
摘要:"题目" 树形DP,定义状态为的子树保留个节点,且i不连接父亲所需要删去的最小值。 初始化:等于与相连的边数,只需要保留一个节点且要和父亲断开,那只能是这一个节点,其他跟i相连的节点都要断开。 有转移方程$dp[i][j]=min(dp
阅读全文
摘要:"题目" 对于这种题目描述比较长的题,可以考虑简化题意。 简化后的题意: 给定一棵带边权无根树 在其直径上求出一段长度不超过s的路径F, 使得离路径距离最远的点到路径的距离最短。求最短距离。 根据题目范围,直接暴力floyd求多源最短路径。然后求出直径和直径端点。搜索求出直径上的点。然后再
阅读全文
摘要:"题目" 求树的直径,因为任意两个居住点之间有且只有一条通路,所以这是一棵树。 根据题意父母先从C去A,再去B,或者反过来。 我们一定是要让A到B最大,也要让C到A和B的最小值最大。 AB最大一定就是直径了。 CA最大直接先求出任意一条直径的两个端点,必定一个是A、一个是B。然后枚举C,找到最大的$
阅读全文
摘要:"题目" 贪心 贪心思路是先找到每个节点的到最深处的路径,并找到最大值。然后最后答案要加上该最大值和所有路径权值的差。 c++ include define N 600101 define int long long using namespace std; int n, root, cnt, an
阅读全文
摘要:"题目" 一道非常好的树形DP。 状态:为u的子树选n个黑点所能得到的收益最大值。 则最终的结果就是可以为任何值,为了方便,使 然后考虑怎么状态转移,状态转移一般要从方程和边界入手,考虑用背包的思想,得到方程: $$ dp[
阅读全文
摘要:"题目" LCT,或者并查集水过。 首先并查集这道题不能路径压缩,因为路径压缩是为了用牺牲一些信息的方法来加快速度,可是这道题我们需要这个信息,所以不能路径压缩。 剩下的操作就只剩下了暴力并查集,而每次查询前都要使u所在的树换根,使u换为该树的根,可以方便查询。
阅读全文
摘要:"题目" 一道经典的树形dp,其树形DP的原理是递归求解树状结构,并返回已经确立的状态值,形式多为记忆化搜索形式。而树形DP也常常跟其他DP联系起来,这道题就是将树形DP和背包DP联系起来的一道题。 而且该题是01背包,所以要注意的枚举顺序。还要注意j和k的取值范围。 c++
阅读全文
摘要:"题目" 由于题目不要求强制在线,所以可以离线。 而离线的话就会带来许多便利,所以我们可以先处理出全部打击后的图,通过并查集来判断是否连通。 然后再从后往前枚举,得出答案 c++ include using namespace std; define int long long int n, m,
阅读全文
摘要:"题目" 一道比较好想的树形 完全可以用树形DP的基本思路,递归,然后取最优的方法。 c++ include include include include using namespace std; int n, a, b, cnt, maxn, data[100100], d
阅读全文
摘要:打井 "题目" 该题是一个最小生成树的好题,但是比起一般的最小生成树来说他不仅仅有各个井相连,而且还要和地下水相连,所以地下水我们也可以看成一口井。 代码 cpp include using namespace std; struct edge { int a, b, c; }e[100100];
阅读全文