随笔分类 - 算法-树/树剖/点分治
摘要:考虑只划分一轮的情况。对于所有 k,发现划分为 k 块的方案数,要么是 0,要么是 1。对“有唯一一种划分方案”所需的条件稍作转化,就能求出每个 k 是否存在方案了。然后考虑不止划分一轮的情况,可以做一个简单的 DP。时间复杂度是调和级数。
阅读全文
摘要:两棵树上公共的边我们都不去动它。将它们缩起来。然后每次找一个叶子节点,拆掉它和父亲的边。发现一定能找到另一条边加上。可以用并查集维护
阅读全文
摘要:先考虑期望的定义,发现不好计算。于是补集转化,发现转化后可以通过简单的树形 DP 解决。添加叶子时,只需要更新它祖先的 DP 值。并且在精度允许的范围内,我们只需要更新距离不超过某个阈值的祖先。
阅读全文
摘要:树形 DP。把第二维搬到线段树上,然后线段树合并。这是常见的套路(NOI2020 d1t2),但在本题里会 MLE。进一步优化,需要根据题目性质(有效 DP 值的单调性),将线段树改为 set,做启发式合并。
阅读全文
摘要:分析问题性质,容易得到一个 O(n^2) 做法。考虑对每个 Alice 的起点二分答案。换成整体二分,每次建虚树,在虚树上树形 DP,即可做到 O(n log^2 n)。注意要判断一个节点到 Alice 和 Bob 距离相等的情况,比较复杂。
阅读全文
摘要:一个结论是,不存在大小大于 2 的环。于是我们只需要保证图连通即可。从高到低考虑每一位,把数分成当前位为 0 的集合和当前位为 1 的集合,则为保证连通,必须有至少一个集合,大小小于 2。枚举删哪个集合,然后递归即可。本质是在 Trie 树上树形 DP。
阅读全文
摘要:树形DP。转移时将儿子按 h 的大小关系分成三类。枚举和 h[u] 相等的儿子里,有几个定向为向上,则可以贪心地取 dp[v][0] - dp[v][1] 前若干大的。
阅读全文
摘要:设dp(i)表示i棵树必胜的方案数(第一棵树的根可以任意,所有根的方案数加起来)。转移时在前面添加一棵树。枚举添加的这棵树的根。发现系数之和可以预处理出来。不过对每个根都预处理一次,复杂度就是n^2了,所以要换根。求出系数之后,用矩阵快速幂优化这个DP即可。
阅读全文
摘要:先做一个二维DP:dp[u][i]表示点u的祖先边中离它最近的,颜色为1的边,深度为i,此时节点u子树内的边的染色方案数。然后把第二维搬到线段树上,做线段树合并
阅读全文
摘要:树形DP。设dp[u][x]表示,u的所有祖先(不含u)对u的贡献和为x时,u的子树内最少还需要进行多少次操作。设u和它的祖先的贡献和为y。则dp[u][x]可以从sum(dp[v][y]) + [y!=x] 转移过来。x可能很大,不过可以证明,我们只需要考虑所有l,r这些端点。所以离散化一下即可
阅读全文
摘要:集合内两两距离小于等于x,等价于集合里深度最大的点,到所有其他点距离均小于等于x。把所有点按深度排序。依次枚举一个点作为深度最大的点,然后将它标记。我们每次要求所有已标记的点中到当前点距离小于等于x的点的数量。可以用点分树+树状数组统计。统计出这个后,做一遍FFT求出答案
阅读全文
摘要:选入了一些比较简单的题。太偏的和太难的,就不放进来啦~
阅读全文
摘要:求最大值不具有可减性,所以无法通过一般的数据结构实现删除。考虑二分答案,将最大值问题转化为数量问题。但是每次二分后要暴力加入所有权值大于mid的路径,单次询问时间复杂度太高。注意到对于二分时相同的“答案区间”,要加入的其实是同一些路径。所以做整体二分即可
阅读全文
摘要:题目链接 考虑求出一个数组$g$,$g[i]$表示至少有$i$个非平局的方案数。也就是说,我们钦定了$i$对点,每对点都是“祖先-后代”的关系,剩下的$m-i$对点可以任意匹配,此时的方案数就是$g[i]$。我们设答案为$f[0\dots m]$,$f[i]$表示的是恰好有$i$个非平局回合的方案数
阅读全文
摘要:感谢 myt 神仙教会了我树状数组!Orz! 果树和人是相对运动的,因为是对人做询问,所以可以考虑让人不动,果树运动。这样的好处是可以把人的结构固定下来,便于用数据结构维护。 具体来讲,对于所有$i\in[1,n]$,我们从第$i$个人向逆时针方向第一个到他的距离$\geq C$的人$j$连边。表示
阅读全文
摘要:LOJ3277 「JOISC 2020 Day3」星座 3 题目大意 题目链接 建议直接阅读原题题面。 本题题解 考虑一个区间,初始时为$[1,n]$。每次找出区间中楼房的最大高度$mx$。高度为$mx$的这些楼房把区间划分为了若干段,我们继续递归每一段。递归的边界是区间内所有楼房高度相同时不再递归
阅读全文