树分治
DOFYPXY
这个作者很懒,什么都没留下…
展开
-
[BZOJ1468]Tree 点分治
点分治模板。 易错点:分治时候传进函数里的size应为(sz[p->t]>sz[rt]?size-sz[rt]:sz[p->t]) 代码:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int maxn=40010;int n,k,top,ans;bool vis[maxn]原创 2017-12-11 10:47:59 · 284 阅读 · 0 评论 -
[BZOJ3784]树上的路径 点分治序+ST表
点分治序就是每次点分治时的dfs序拼起来。点分治序的长度应该是nlogn的。 然后对于每一条路径(u,v),在出现了u的分治结构中,v总是在点分治序的一段区间里,就可以同NOI2010超级钢琴一样维护了,就是从堆中取出最大值,并把所在区间再分成两部分扔进堆里,重复m次即可。复杂度O(nlog^2n)。 代码:#include<iostream>#include<cstdio>#include原创 2017-12-11 10:54:58 · 468 阅读 · 0 评论 -
[BZOJ4012]开店 点分治+STL
听说这种距离之和的题目都是一眼想到点分治。。。 考虑一个点u在点分治过程中只会被覆盖logn次,也就是说会被logn个重心所管辖。所以对于每个询问,只要把覆盖u点的每个重心的答案累加即可。 当重心为rt,对于其每个儿子i,贡献为: Counti*disu+Sumi。 其中Counti表示i的子树中年龄在[l,r]中的点的个数,disu表示u到rt的距离,Sumi表示i的子树中年龄在[l,r]原创 2017-12-13 20:28:06 · 366 阅读 · 0 评论 -
[BZOJ4182]Shopping 点分治+dfs序+多重背包单调队列
题目的限制就是买的点必须是一个联通块。 考虑先枚举一个点必选,那么就是一个有依赖的多重背包(就是选了子树根才能选子树中的点),用一下树型背包的套路:先搞出dfs序,设fi,jf_{i,j}表示考虑了dfs序后ii个点,花了jj的钱的答案,如果不选就跳过整棵子树的区间,如果选就从i+1i+1转移过来即可。 考虑把这个枚举变成点分治就可以了,复杂度O(mnlogn)O(mn\log n)。 代码原创 2018-01-04 22:05:32 · 814 阅读 · 2 评论 -
[BZOJ2870]最长道路tree 边分治
因为点分治会带来子树信息合并的问题,于是考虑通过添加虚点的方法把多叉树转成二叉树,然后采用边分治,每次考虑经过分治重边的情况,把两边的所有点按路径上的最小权值排序,然后相互更新一下即可,复杂度O(nlog2n)O(nlog2n)O(n\log ^2n)。 因为多叉树转二叉树的过程中添加了虚点,所以假如xxx和yyy的lca是虚点,那么路径(x,y)(x,y)(x,y)上原本的那个实点lca的信...原创 2018-05-16 11:48:24 · 800 阅读 · 0 评论 -
[联合集训6-19] 山洞 点分树
一句话题意就是求点分树最小深度。 点分树有一个性质:我们称点iii在点分树上距叶子的距离为其权值wiwiw_i,那么对于两个点u,vu,vu,v满足wu=wv=kwu=wv=kw_u=w_v=k,在原树路径(u,v)(u,v)(u,v)上一定存在点ttt使得wt&amp;gt;kwt&amp;gt;kw_t&gt;k,证明很显然。 我们对每个点iii求出一个二进制状态,二进制第kkk位表示该点子树中存不存在一个wj...原创 2018-06-21 21:27:39 · 377 阅读 · 0 评论 -
[联合集训6-9] El 点分治+哈希表
转化题意,就是根据题目所给的式子定义颜色,求同色三角形的个数。 有一个经典结论:完全图同色三角形个数=总三角形个数-异色角个数/2。因为每个异色三角形都恰有两个异色角。 在有向完全图中结论依然成立,但这里的异色角就要分别统计两出,一入一出,两出三种情况。我们只需要分别知道每个点进/出的红/绿路径数量即可。这个可以用点分治解决。 具体地,对于一个分治中心rootrootroot,我们求出它到该...原创 2018-06-10 21:55:23 · 293 阅读 · 0 评论