随笔分类 - 树上问题
摘要:LCT好题 首先我们考虑实际询问的是什么: 从LCT的角度考虑,如果我们认为一开始树上每一条边都是虚边,把一次涂色看作一次access操作,那么询问的实际就是两个节点间的虚边数量+1和子树中的最大虚边数量! 这种问题显然树上容斥,如果设表示到根节点需要经过多少虚边,那么答案显
阅读全文
摘要:真·小清新... 其实本题正解是动态点分治,但是考虑到那个东西需要先大力推导一波再套上一个幻想乡战略游戏的搞法,所以还不如大力推导一波,然后无脑套上一个树剖+线段树写法... 首先我们考虑没有换根操作: 没有换根操作时,设每次修改的变化量为,很显然每次修改时只会影响一条树链上的贡献,
阅读全文
摘要:动态点分治好题 首先我们考虑一个暴力做法: 每次修改之后选一个点作为根搜索整棵树,然后换根dp即可 考虑每次换根时,移向的点的消耗会减少子树代价之和*边权,而其余部分代价会增加剩余代价*边权 这样每次换根都是的,总时间复杂度,可以通过...20分! 贴代码: 然后我们考虑正
阅读全文
摘要:首先仍然是点对之间的问题,让我们考虑点分 由于带修改,所以考虑动态点分治 所谓动态点分治,就是在操作之前先模拟一遍点分治的过程构造出一棵新的树,我们称这棵树为点分树,由于这棵树树高是对数级别的,所以修改的时候可以在一条树链上暴力修改 然后考虑本题怎么维护: 首先我们考虑答案如何统计:在统计答案时,我
阅读全文
摘要:点分治好题 统计距离正常点分治统计即可,我们只需考虑何时达到最优 有两种情况: 第一:代价最大的询问两个端点在不同的两个子树中 因为这种情况下,无论根向那个子树移动都会等价地增加到达另一个端点的代价,因此此时总代价已经达到最小 第二:代价最大的询问有多组,且这些点不在同一棵子树中 同情况一,如果我们
阅读全文
摘要:太久没碰点分治的我看见这题已经失了智... 首先这种统计肯定要想一想点分,当然也有树形dp的做法,不过还是用点分吧... 我们每次找到一个根,然后统计以这个根为中心,模3为0,1,2的路径数量(这一点可以直接搜索),然后做个卷积统计一下即可 但是可能会出现重复的情况,重复来源于这种时候: 如图所示,
阅读全文
摘要:这是个假题吧... 首先显然上虚树了 然后我们考虑一下最优策略: 如果虚树两节点都是关键点,那么这两点之间至少选一个 如果一个节点本身是关键点,那么我们必须覆盖下下面所有点 如果一个节点本身不是关键点,那么这个点可选可不选,这一点要基于下面有多少个上来来决定 也就是说,我们在虚树上dfs的过程中需要
阅读全文
摘要:首先是动态dp了嘛... 然后考虑怎么做:首先列出dp方程,大概长这样: 看着不太像动态dp呀... 考虑拿出重儿子的贡献,然后套模型,大概能构造出一个这样的东西: 设 $\begin{p
阅读全文
摘要:首先我们考虑事件发生的真正的先后顺序 我们考虑在某一个点的子树内有两点,先后在,两个时间向上发送信息 那么两者谁会先传到呢? 推个小式子:设先到达,那么一定要满足的条件是<$dep_{j}-
阅读全文
摘要:首先有个思想,就是逐层更新 然后考虑每次查询是查从某一点到根节点的树链上的信息,因此用树链剖分维护即可,处理每个点的对子树中节点的贡献可以区间修改(只需修改这一节点向上的树链即可),然后查询时区间查询,去掉不合法的部分即可 时间复杂度,其实本题正解应当是$O(nl
阅读全文
摘要:动态dp是一个毒瘤且奇葩的东西... 然而noip2018出了这个东西... 因此... 以一道题为例吧:给出一棵带点权的树,每次修改一个点的点权,查询这棵树的最大权独立集(可以理解为每次询问一遍“没有上司的舞会”) 首先考虑暴力: 设状态表示以为根的子树,点选或不
阅读全文
摘要:首先吐槽一下bzoj,这CF原题还做成权限题啊?! 需要注意的是,一个点不能被选中当且进当这个点在第y+1年到现在这一段时间内受到攻击,其余的点都可以被选 然后...其实这题的重点在于...码 思想很简单,先树链剖分,然后建起一棵主席树维护,每次修改就生成一个新版本,这样的话用现在的版本-时刻y的版
阅读全文
摘要:好神的一道题啊... 码量极小... 题意:求树上从根到叶节点的最长不下降子序列 怎么搞? 最显然的思想是树形dp,也是绝大多数的做法,但本蒟蒻不会... 所以我们换成玄学方法... 首先,我们仍然借助树形dp的思想,维护以某一个节点为根节点的子树信息 那么,我们不难发现,一个点如果能对其上的点产生
阅读全文
摘要:和上一题很像,而且这题直接给出了单点修改和区间查询,所以还是两棵线段树容斥即可
阅读全文
摘要:动态点分治裸题 首先介绍一下动态点分治:就是带修改操作的点分治(废话) 操作涉及单点查询和区间修改 那么首先应该想到线段树 但是怎么操作呢? 首先,修改一个点时的影响范围可以分为上下两部分:一部分在自己的子树内,另一部分通过自己的父节点传上去或传到其他子树内 那么为了使这种操作复杂度尽可能低,我们用
阅读全文
摘要:首先很容易看出这是一个树上多重背包问题 设状态表示以为根的子树中利用的体积是 但是题目中有要求:选择的点集必须是一个联通块 这要怎么处理? 点分治! 首先我们利用点分治的思想,每次拎起一个根节点进行处理,要求这个根节点必选,然后在子树内进行dp 为了保证根节点必选(至少
阅读全文
摘要:还是点对之间的问题,果断上点分治 同样,把一条路径拆分成经过根节点的两条路径,对不经过根节点的路径递归处理 然后,我们逐个枚举根节点的子树,计算出子树中某一点到根节点的距离,然后在之前已经处理过的点中找,看有没有距离之和等于k的,如果有就取最小值(这里用桶维护即可) 然后再把这个子树内的信息扔进桶里
阅读全文
摘要:题目描述:这里 发现还是点对之间的问题,于是还是上点分 只不过是怎么做的问题 首先对每条边边权给成1和-1(即把原来边权为0的边边权改为-1),那么合法的路径总权值一定为0! 还是将路径分为经过当前根节点和不经过当前根节点的,对不经过当前点的递归处理 那么我们讨论经过当前根节点的路径算法即可 可以发
阅读全文
摘要:点分治入门题 首先发现是树上点对的问题,那么首先想到上点分治 然后发现题目要求是求出树上点对之间距离小于等于k的对数,那么我们很自然地进行分类: 对于一棵有根树,树上的路径只有两种:一种经过根节点,另一种不经过根节点 对于经过根节点的路径,我们可以通过计算出每个点的根节点的距离,然后相加就能求出点对
阅读全文