随笔分类 - 树论——点分治
摘要:XVIII.[PA2017]Banany 心血来潮想开道动态点分治的题练手,然后被折磨了一下午…… 首先,套上点分树是没问题的。那么,怎样维护修改呢? 单点修改无论用什么结构维护都是非常easy的;但是边的修改就不太简单了,因为它涉及到不止一条路径。 我们设当前修改了边 。对于点分
阅读全文
摘要:XVII.CF434E Furukawa Nagisa's Tree 我们观察所有合法对,发现其在枚举一个点、找到关于该点符合条件的另两点时,并不能唯一判定该三元环一定合法,因为另两点间的边不一定符合条件。但是,观察不合法的对,就会发现其中有且仅有两个点,其连接了一条好路径与一条坏路径(好路径即满足
阅读全文
摘要:XVI.CF715C Digit Tree 好久没写淀粉质了,省选前就来一题练练手罢。 路径上的数就拆成两半分别取模,最后用一个 map 储存并合并即可。因为本题维护的信息(对数)具有可减性,因此可以采取求出整棵树的值后,减去每棵子树的值的做法。 本题的 unordered_map 被卡了,必须用
阅读全文
摘要:XV.[Codeforces GYM 101002K] YATP (没有单独的页面,就放个到大页面的连接罢) 我们考虑先套一个点分治。点分治后,考虑计算所有LCA为根节点的对中,最优的那些对。 我们考虑就算某两个点它们位于同一棵子树内也不要紧——这里它的权值被表示成 \(dep_i+dep_j+a_
阅读全文
摘要:XIV.[URAL2085]Magic Programmer 如何处理路径上所有东西出现且只出现一次的限制呢?我们考虑哈希。只需要用一个哈希表处理所有出现过的东西,然后求另一半东西时,找出它的补集的哈希值在哈希表中查询,即可做到路径拼接。 代码: #include<bits/stdc++.h> us
阅读全文
摘要:XIII.[USACO18JAN]Cow at Large P 这题我做的时候时限1s,然后卡不过去……之后不得不发帖请求把时限调大到题面中的4s 假设当前询问了点,那么我们把这棵树变成以为根,设为此刻节点的深度。 我们再令表示节点距离最近的叶子的
阅读全文
摘要:XII.小清新数据结构题 太 清 新 了 话说就我一个人看到这道题后兴冲冲的以为暴力LCT就能过然后发现LCT如果维护子树信息的话只有根节点处的信息是正确的吗(没错,就我一个) 闲话少说,正片开始。 法一:推一种式子,然后LCT/树剖维护 我们设为节点的值,然后为根
阅读全文
摘要:XI.[USACO12NOV]Balanced Trees G 与上题类似,我们仍然需要分成路径和路径两部分考虑。默认将根归为路径中考虑。 首先是判断怎样搞才是合法的。关于这个,我们可以用一个pair<int,int>来记录全部匹配完后,剩余的)与(的数量,其中first表示
阅读全文
摘要:X.[COCI2019] Transport 常规淀粉质的题也可以出的非常毒瘤…… 依旧考虑淀粉质。因为这里的路径是有向路径,所以会在分治中心被截成两半,一半从节点到根,记作路径;而另一半从根到节点,记作路径。显然,一条路径只能与来自不同子树的一条路径拼接,并且这两条
阅读全文
摘要:IX.[BJOI2017]树的难题 debug三天,精神崩溃 论一行if(vis[v[x][r].second]){r++;continue;}忘记加上后所有代码全都莫名其妙TLE且查不出锅的痛苦 首先,我们考虑常规淀粉质。 我们考虑一条路径,它会被(淀粉质的分治根)截成两段。如果我们对于分治树中的
阅读全文
摘要:VII.[HNOI2015]开店 首先,第一种方法便是动态点分治。 我们先考虑忽略年龄限制的情形。 我们考虑正常求一个点到另一个点的距离应该怎么求—— 一般来说,我们会用对吧? 这个东西相当于将路径划分成两个部分,其中每个
阅读全文
摘要:VI.【模板】点分树 | 震波 我们之前讲过一个叫做淀粉徐的东西,但就跟dfs序一样,把树压成序列,总会损失一些信息。有没有方法能够完整地维护出来淀粉质的信息呢? 还真有。 我们看到在对于某个点淀粉质时,它的所有子树,都会拥有一个下层的分治节点。 我们看到淀粉质的代码: void solve(int
阅读全文
摘要:V.[FJOI2014]最短路径树问题 这题已经在我的收藏夹里吃了大半年的灰了……主要是因为他们有人把这题归到了树形DP里面,然后我就傻乎乎地把它收藏了…… 首先,假设我们已经求出了这个“最短路径树”,剩下的就是点分治的板子了。 而这个“最短路径树”,首先可以通过Dijkstra跑出最短路径DAG,
阅读全文
摘要:IV.树上游戏 考虑淀粉质。 对于一棵分治树,我们考虑对树中所有LCA为根节点的路径计算贡献。 我们对于根节点一棵子树一棵子树地处理。设表示子树外有多少条以根节点为一个端点的路径上有颜色。则我们当前子树中的一个点的贡献可以分作两部分:子树外的部分(即)
阅读全文
摘要:III.BZOJ3784: 树上的路径 思路1: 淀粉质。用priority_queue维护前长的路径的长度。用multiset维护点分治时,之前所有子树的路径长度,然后对于新子树中的每一条路径,在multiset中从大往小枚举另一半路径拼一起并尝试加入优先队列。如果加入失败,那么对于这个点,
阅读全文
摘要:II.BZOJ4675: 点对游戏 (因为C++11的缘故在BZOJ上交会CE) 思路: 我们首先使用淀粉质找出所有长度为“幸运数”的路径数量,设为。然后,设表示个点间所有的路径数量(即为$\dfrac{x(x-1)}{2}\dfrac{tot\ti
阅读全文
摘要:I.[IOI2011]Race 思路:弱智淀粉质题。唯一缺点就是卡常,卡的要死要活。 具体来说,只需要开出桶来(因为最大只到,因此直接处理长度的路径存入桶中求即可。 代码: #include<bits/stdc++.h> using namespace
阅读全文