传送门


毒瘤数据结构题qwq

设三棵树分别为$T1,T2,T3$

先将$T1$边分治,具体步骤如下:

①多叉树->二叉树,具体操作是对于每一个父亲,建立与儿子个数相同的虚点,将父亲与这些虚点穿成一条链(父亲在链顶),在虚点的另一边接上儿子,之前父亲到儿子的边权移动到虚点到这个儿子的边上。代码长下面这样

    void rebuild(int x , int f){
        int pre = ++cntNode , p = x;//pre是当前虚点的编号
        for(int i = Thead[x] ; i ; i = TEd[i].upEd)
            if(TEd[i].end != f){//连接上一个虚点、当前虚点和一个儿子。
                addEd(Ed , head , cntEd , x , pre , );
                addEd(Ed , head , cntEd , pre , x , );
                addEd(Ed , head , cntEd , pre , TEd[i].end , TEd[i].w);
                addEd(Ed , head , cntEd , TEd[i].end , pre , TEd[i].w);
                rebuild(TEd[i].end , p);
                x = pre;//替换当前接的虚点
                pre = ++cntNode;
            }
    }

②选择一条边,使得两侧的子树大小差距尽可能小;③计算经过这条边的路径的答案;④分治旁边的两个子树

至于为什么不用点分治……等会儿再提

设我们分治的边为$(s,t)$,切掉这条边之后的两棵子树分别为$L,R$,设$dis1_i$表示$i$到$(s,t)$边的距离,$dis_{Tx}(i,j)$表示在第$x$棵树上$i$到$j$的距离

那么我们在③步骤中需要求的就是满足$i \in L , j \in R$的$$ans=dis_1i+dis_1j+w(s,t)+dis_{T2}(i,j)+dis_{T3}(i,j)$$的最大值

稍微魔改一下式子,设在$T2$上根到$i$的路径上所有边的边权和为$dis_2i$

那么$ans=dis_1i+dis_1j+dis_2i+dis_2j-2 \times dis_2LCA(i,j)+dis_{T3}(i,j)+w(s,t)$

我们考虑枚举$LCA(i,j)$,那么$dis_2LCA(i,j)$与$w(s,t)$对答案最大值就不会产生影响了,会产生影响的部分就是

$$delta = dis_1i+dis_1j+dis_2i+dis_2j+dis_{T3}(i,j)$$

我们把$dis_1i+dis_2i$看做在$T3$上新增了一个$i'$点,与$i$分属同一子树($L$或$R$),且只与$i$连了一条权值为$dis_1i+dis_2i$的边。我们设新的树为$T3'$,那么我们需要在$T3'$上找到两个点$x,y$,满足$x \in L , y \in R$且$dis_{T3'}(x,y)$最大

到这里我们需要一个结论帮助:如果点集$A$中最长路的两个端点为$u,v$,点集$B$中最长路的两个端点为$x,y$,则跨过$A,B$的最长路的端点可能的组合只有$(u,x)(u,y)(v,x)(v,y)$。这意味着我们可以用树形$DP$维护$T2$中子树内所有点在$T3'$上的最长路对应的两个端点。

考虑在$T2$上对$L \cup R$的点建立虚树。设$f_{i,0/1}$表示在$T2$树上$i$的子树中,且属于$T1$中$L/R$子树,在$T3'$上取到最长路的两个点,合并直接把四个端点拿出来一一在$T3'$上算路径长度取$max$即可。我们在合并答案的时候计算贡献,也就是说在合并$f_{i,0/1}$和$f_{son_i,0/1}$的时候跑一下$T3$上最大值贡献答案。求出距离之后,这时两端点的$LCA$必定是$i$,再减掉$2 \times dis2_i$、加上$w(s,t)$就能够得到$ans$了。

那么为什么不使用点分治也就很明了了。边分治必定将原树分成两个子树,但是点分治可能会分成很多,很多的子树之间的合并会很麻烦,所以在这种方法中点分治不能用…当然似乎每一次合并最小的两个子树在点分治下和边分治就是相同的。

代码

UOJ347 WC2018 通道 边分治、虚树的更多相关文章

  1. [WC2018]通道——边分治+虚树+树形DP

    题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...

  2. LOJ 2339 「WC2018」通道——边分治+虚树

    题目:https://loj.ac/problem/2339 两棵树的话,可以用 CTSC2018 暴力写挂的方法,边分治+虚树.O(nlogn). 考虑怎么在这个方法上再加一棵树.发现很难弄. 看了 ...

  3. UOJ#347. 【WC2018】通道 边分治 虚树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ347.html 题意 有三棵树,边有边权. 对于所有点对 (x,y) 求在三棵树上 x 到 y 的距离之和 ...

  4. 【UOJ347】【WC2018】通道 边分治 虚树 DP

    题目大意 给你三棵树,点数都是\(n\).求 \[ \max_{i,j}d_1(i,j)+d_2(i,j)+d_3(i,j) \] 其中\(d_k(i,j)\)是在第\(k\)棵数中\(i,j\)两点 ...

  5. 洛谷P4220 [WC2018]通道(边分治+虚树)

    题面 传送门 题解 代码不就百来行么也不算很长丫 虽然这题随机化贪心就可以过而且速度和正解差不多不过我们还是要好好学正解 前置芝士 边分治 米娜应该都知道点分治是个什么东西,而边分治,顾名思义就是对边 ...

  6. BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP

    题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...

  7. LOJ 2553 「CTSC2018」暴力写挂——边分治+虚树

    题目:https://loj.ac/problem/2553 第一棵树上的贡献就是链并,转化成 ( dep[ x ] + dep[ y ] + dis( x, y ) ) / 2 ,就可以在第一棵树上 ...

  8. 【XSY3350】svisor - 点分治+虚树dp

    题目来源:NOI2019模拟测试赛(九) 题意: 吐槽: 第一眼看到题觉得这不是震波的完全弱化版吗……然后开开心心的码了个点分治 码到一半突然发现看错题了……心态崩了于是就弃疗手玩提答去了 于是就快乐 ...

  9. 洛谷 P6199 - [EER1]河童重工(点分治+虚树)

    洛谷题面传送门 神仙题. 首先看到这样两棵树的题目,我们肯定会往动态树分治的方向考虑.考虑每次找出 \(T_2\) 的重心进行点分治.然后考虑跨过分治中心的点对之间的连边情况.由于连边边权与两棵树都有 ...

随机推荐

  1. javascript arguments参数问题

    function f(a, b, c){ alert(arguments.length); // result: "2" a = 100; alert(arguments[0]); ...

  2. 自定义控件详解(一):Paint类与Canvas类

    前言: 自定义控件必需的两个类:Paint与Canvas Paint    ---  相当于绘图的"笔" Canvas --- 相当于绘图的"纸" 一.Pain ...

  3. pyhthon常用模块hashlib

    python hashlib模块 一,hashlib模块主要用于加密,其中提供sha1,sha224,sha256,sha384,sha512,md5算法.常用的使用md5即可完成需求. 一,使用md ...

  4. C#语言————第四章 深入C#的String类

    *********类型转换**************** Convert与Parse的区别: Convert可以将任何内置类型转换为其他任何内置类型 XX.Parse:只能将字符串转换为XX类型例如 ...

  5. Linksys EA6500刷ddwrt成功记

    网上刷Linksys EA6500的资料不多,然后又绕了好多个弯子,自己记录备忘. 首先EA6500有两个版本v1和v2,对应的固件不同. 区分方法: 1.v1的背后是两个颜色一样的usb2.0 2. ...

  6. Linux 小知识翻译 - 「RAID」

    最近术语「RAID」变得比较有名.「RAID」是指将多个HDD组合起来使用,从而提高存储可靠性的一种技术. 那么,关于 RAID 中的 「RAID 0」「RAID 1」「RAID 5」等各种「RAID ...

  7. Java用户名登录学生信息管理系统并对其进行增删改查操作

    package zzzzzzzz; import java.io.*;//作者:凯鲁嘎吉 - 博客园//http://www.cnblogs.com/kailugaji/ public class T ...

  8. 社交网络编程API之iOS系统自带分享

    社交网络编程API 社交网络编程主要使用iOS提供的Social框架,目前Social框架主要包含两个类: SLComposeViewController 提供撰写社交信息(如微博信息)的视图控制器, ...

  9. js实现Mac触摸板双指事件(上/下/左/右/放大/缩小)

    前言 这几天在修复一个web问题时,需要捕获Mac触摸板双指事件(上.下.左.右.放大.缩小),但发现并没有现成的轮子,还是要自己造. 例如:jquery.mousewheel.js(添加跨浏览器的鼠 ...

  10. 怎样将本地web项目部署到腾讯云服务器上?

    怎样将本地web项目部署到腾讯云服务器上? 1.本地计算机的工作: (1).用eclipse新建一个web项目,然后在webcontent下新建一个index.html,然后在本地部署到Tomcat服 ...