树分治
untilyouydc
月份未到你也得接受
展开
-
Tree Cutting HDU - 5909 (树形dp + 树分治)
思路:第二道树分治题,但这题首先要先解决dp的递推表达式。 首先先确定一点,同一子树上的dfs序一定是连续的,这也就给了我们一个将树上的dp映射到普通dp上(普通dp我们研究的元素之间通常是连续的)。换句话说,按dfs序的话,我们就可以考虑前i项构成的子树这样的情况,如果不是dfs序,那么前i项可能在不同子树,这与题目要求不符。 设dp[i][j]表示考虑了dfs序的前i项,目前连通块的异或和...原创 2018-09-30 23:57:19 · 300 阅读 · 0 评论 -
聪聪可可 HYSBZ - 2152 (树分治)
思路:这题和https://blog.csdn.net/qq_40774175/article/details/82909005,非常类似,这里只不过多了一步转化。 它要处理3的倍数,为了方便,我们在建图和统计长度的时候都进行模3操作,这样,最后两个点之间的路径只可能是0,1,2,然后我们就可以利用他们进行组合成3的倍数,首先0和0组合,然后1和2组合,然后2和1组合(在这题中(1,2)和(2,...原创 2018-10-01 10:56:50 · 249 阅读 · 0 评论 -
Boatherds POJ - 2114 (树分治)
思路:还是和以前求路径值<=k,一样的套路,改下cal函数里计算==k的方法就行。 代码: #include<iostream> #include<map> #include<string> #include<cstring> #include<vector> #include<algorithm> #includ...原创 2018-10-01 20:58:59 · 161 阅读 · 0 评论 -
D Tree HDU - 4812 (树分治+逆元线性预处理+map映射)
思路:首先一个最重要是思路:ai*aj%mod=k%mod 即a[i]=k*inv[a[j]]%mod。 所以对于一条路径上的乘积是否为k,我们考虑将其分成2部分,第一部分乘起来放map里,第二部分乘了以后去map里找,如果找到,说明有这样的组合可以乘积为k,既满足题意。 具体实现的思路自然是点分治,一次找重心做为根节点,需要注意的是,每次重新选根节点,都要清空map,因为重新找一颗子树时,相...原创 2018-10-02 23:20:11 · 273 阅读 · 0 评论 -
Tree POJ - 1741 (树分治入门)
参考论文:https://wenku.baidu.com/view/8861df38376baf1ffc4fada8.html 这题的两个关键部分: 1. 求出树的重心(这在之前的博客里面提到,不在叙述) 2. 如何进行分治。 首先,如果我们选定一个点作为根节点,那么一条路径要么经过这个根节点,要么不经过这个根节点。 题目要求出所有路径小于等于k的路径,我们可以这样考虑(先不考虑重复的),...原创 2018-09-30 14:38:32 · 644 阅读 · 0 评论