摘要: 传送门 这道题好神奇啊……如果要是不带修改的话那就是普通的点分治了,每次维护子树中距离次大值和最大值去更新。 不过这题要修改,而且还改500000次,总不能每改一次都点分治一次吧。 所以我们来认识一个新东西:带修改的点分治,动态点分治! 它可以强势解决带修改点分治问题(但是这玩意真的太难了我这个菜鸡 阅读全文
posted @ 2018-09-14 23:49 CaptainLi 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 传送门 仍然是大规模解决树上路径的问题。 显然是点分治,但是因为我太菜了想不到应该怎么点分治,还是借鉴dalao的经验才想出来。 我们用tmp[i]表示在当前子树中,经过长度为i的路径最少需要几条边。那么转移的方程就是tmp[m] = tmp[m-dis[i]] + d[i],其中m是要求的路径长度 阅读全文
posted @ 2018-09-14 22:41 CaptainLi 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 传送门 这道题看起来是大规模解决树上路径的问题……那就是点分治啦。 既然我们要求的是树上长度为3的倍数的路径有多少条,那么我们不妨对每条路径的长度取模,这样的话我们实际上就获得了一堆长度为0,1,2的路径。因为点分治的性质,它每次只统计当前子树内经过重心的长度为3的倍数的路径,所以我们在每次统计之后 阅读全文
posted @ 2018-09-14 22:19 CaptainLi 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 啥是点分治? 点分治一般来说用于解决大规模的树上路径问题。比如说最经典的一道题,给定一棵树,计算一共有多少点对满足之间距离<=k。 这种题一般数据范围在10^4~10^5,直接暴力求是n^2的肯定会超时。 那怎么办?我们考虑分治。 先说一下点分治的基本思想,就是对于每一棵树,先找到这棵树的重心。 啥 阅读全文
posted @ 2018-09-14 00:26 CaptainLi 阅读(190) 评论(0) 推荐(0) 编辑