题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个分析有1.2.3棵树时的做法. 首先说一个结论,在下面讲解中能应用到: 对于一棵树T1的直径两端点为u,v,对于另一棵树T2的直径两端点为x,y,如果将两棵树合并(即将两棵树中的各一个点连边)那么新树的直径的两端点一定是u,v,x,y中的两个. 证明见树的直径及其性质与证明. 一.一棵树 这个很好做…
题目大意 给你三棵树,点数都是\(n\).求 \[ \max_{i,j}d_1(i,j)+d_2(i,j)+d_3(i,j) \] 其中\(d_k(i,j)\)是在第\(k\)棵数中\(i,j\)两点之间的距离. \(n\leq 100000\) 题解 设\(d(i,j)=d_1(i,j)+d_2(i,j)+d_3(i,j),h_k(i)\)为\(i\)号点在第\(k\)棵树上的深度 一棵树 树形DP. 时间复杂度:\(O(n)\) 两棵树 这是一道集训队自选题. 点分治+动态点分治 设这两个点…
题目:https://loj.ac/problem/2339 两棵树的话,可以用 CTSC2018 暴力写挂的方法,边分治+虚树.O(nlogn). 考虑怎么在这个方法上再加一棵树.发现很难弄. 看了看题解,发现两棵树还有别的做法. 就是要最大化 d1[ x ] + d2[ x ] + d1[ y ] + d2[ y ] - 2*d1[ lca1(x,y) ] - 2*d2[ lca2(x,y) ] ,考虑在第一棵树 T1 上 dfs 地枚举 lca1 ,那么考虑的答案就是 T1 上在当前点 c…
传送门 毒瘤数据结构题qwq 设三棵树分别为$T1,T2,T3$ 先将$T1$边分治,具体步骤如下: ①多叉树->二叉树,具体操作是对于每一个父亲,建立与儿子个数相同的虚点,将父亲与这些虚点穿成一条链(父亲在链顶),在虚点的另一边接上儿子,之前父亲到儿子的边权移动到虚点到这个儿子的边上.代码长下面这样 void rebuild(int x , int f){ int pre = ++cntNode , p = x;//pre是当前虚点的编号 for(int i = Thead[x] ; i ;…
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ347.html 题意 有三棵树,边有边权. 对于所有点对 (x,y) 求在三棵树上 x 到 y 的距离之和 的最大值. 点数 <=100000 题解 我自闭了. 在此之前,我没写过边分治,只写过一次虚树. 我自闭了. 一棵树怎么做? 树的直径. 两棵树怎么做? 有一个定理:从点集A中的点到点集B中的点的最长路径的两端点一定属于   点集A中最长路两端点和点集B中最长路两端点  构成的集合. 首先,在第一…
题目来源:NOI2019模拟测试赛(九) 题意: 吐槽: 第一眼看到题觉得这不是震波的完全弱化版吗……然后开开心心的码了个点分治 码到一半突然发现看错题了……心态崩了于是就弃疗手玩提答去了 于是就快乐垫底了 最后发现这是个最毒瘤的题……改题写+调了一天,代码长度再次进入前五排行榜 题解: (明明是在线做法为什么不强制在线呢) 由于是询问树上某些关键点的信息,且$\sum k$比较小,所以考虑建出虚树处理询问: 如图,对于虚树上一个不是关键点的点$u$,显然他的最大监视半径就是$max\{r_v-…
题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中关键点到它距离最小值 第二次dp,用第一次的信息,从上往下转移,求出每个点到所有关键点中到它距离最小值 这里兼容性讨论一下,发现可以不用存次大值,因为若最小值来自要更新的子树,则子树中点到上面的点的距离一定不优 前两次dp求出了虚树中1,2类点被谁控制 第三次dp,对于每条边,找到断点,细节见代码…
题目大意:多次给出关键点,求切断边使所有关键点与1断开的最小费用 分析:每次造出虚树,dp[i]表示将i和i子树与父亲断开费用 对于父亲x,儿子y ①y为关键点:\(dp[x]\)+=\(dismn(x,y)\) ②y不为关键点:要么断y,要么断y所有子树 \(dp[x]\)+=\(min(dismn(x,y),dp[y])\) ========================================================= 关于兼容性的一种讨论 dismn(x,y)直接改为d…
[题意]给定n个点的带边权树,每次询问给定ki个特殊点,求隔离点1和特殊点的最小代价.n<=250000,Σki<=500000. [算法]虚树+DP [题解]考虑普通树上的dp,设f[x]表示隔离1和子树x内特殊点的最小代价,val[x]表示x到1路径上的最小代价(预处理). 点x特殊,f[x]=val[x] 否则,f[x]=min{val[x],Σf[y]},y=son[x] 在询问总数有限制的前提下,可以建虚树进行如上DP. 复杂度O(Σki log n). 注意: 1.清空时垃圾回收,…
暴力枚举非树边取值做DP可得75. 注意到每次枚举出一个容斥状态的时候,都要做大量重复操作. 建立虚树,预处理出虚树上两点间的转移系数.也可动态DP解决. 树上倍增.动态DP.虚树DP似乎是这种问题的三种通用解法. 代码不是特别长但极其难写,预处理过程中要考虑各种情况.水平不够只好抄代码. #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) #define F…