UOJ347 WC2018 通道 边分治、虚树
毒瘤数据结构题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 通道 边分治、虚树的更多相关文章
- [WC2018]通道——边分治+虚树+树形DP
题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...
- LOJ 2339 「WC2018」通道——边分治+虚树
题目:https://loj.ac/problem/2339 两棵树的话,可以用 CTSC2018 暴力写挂的方法,边分治+虚树.O(nlogn). 考虑怎么在这个方法上再加一棵树.发现很难弄. 看了 ...
- UOJ#347. 【WC2018】通道 边分治 虚树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ347.html 题意 有三棵树,边有边权. 对于所有点对 (x,y) 求在三棵树上 x 到 y 的距离之和 ...
- 【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\)两点 ...
- 洛谷P4220 [WC2018]通道(边分治+虚树)
题面 传送门 题解 代码不就百来行么也不算很长丫 虽然这题随机化贪心就可以过而且速度和正解差不多不过我们还是要好好学正解 前置芝士 边分治 米娜应该都知道点分治是个什么东西,而边分治,顾名思义就是对边 ...
- BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...
- LOJ 2553 「CTSC2018」暴力写挂——边分治+虚树
题目:https://loj.ac/problem/2553 第一棵树上的贡献就是链并,转化成 ( dep[ x ] + dep[ y ] + dis( x, y ) ) / 2 ,就可以在第一棵树上 ...
- 【XSY3350】svisor - 点分治+虚树dp
题目来源:NOI2019模拟测试赛(九) 题意: 吐槽: 第一眼看到题觉得这不是震波的完全弱化版吗……然后开开心心的码了个点分治 码到一半突然发现看错题了……心态崩了于是就弃疗手玩提答去了 于是就快乐 ...
- 洛谷 P6199 - [EER1]河童重工(点分治+虚树)
洛谷题面传送门 神仙题. 首先看到这样两棵树的题目,我们肯定会往动态树分治的方向考虑.考虑每次找出 \(T_2\) 的重心进行点分治.然后考虑跨过分治中心的点对之间的连边情况.由于连边边权与两棵树都有 ...
随机推荐
- win7 x64 +vs2015 + cmake3.10.3编译opencv-3.4.1+opencv_contrib-3.4.1源码,并进行配置
简介: 一直以来都是在ubuntu下使用opencv,最近因为有<图像处理与模式识别>这门课,需要使用vs2015+opencv提交课程作业,因为opencv官方编译好的exe没有cont ...
- Android 开创java世界(JNI Invocation API)
在Android的世界中,由名称为app_process的C++本地应用程序(路径为:framework/base/cmds/app_process/app_main.cpp)调用JNI Invoca ...
- Flutter 布局(十)- ListBody、ListView、CustomMultiChildLayout详解
本文主要介绍Flutter布局中的ListBody.ListView.CustomMultiChildLayout控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. ListBody ...
- Expo大作战(三十六)--expo sdk api之 ImagePicker,ImageManipulator,Camera
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- JavaScript大杂烩10 - 理解DOM
操作DOM 终于到了JavaScript最为核心的部分了,通常来说,操作DOM,为页面提供更为友好的行为是JavaScript根本目标. DOM树 - HTML结构的抽象 既然DOM是操纵HTML ...
- 给 Linux 系统“减肥”,系统垃圾清理_系统安装与配置管理_Linux Today - Google Chrome
给 Linux 系统"减肥",系统垃圾清理 2013/10/16 linux 系统安装与配置管理 评论 15,555 Linux 计算机安装后,在我们不断的使用过程中,因 ...
- [20171113]修改表结构删除列相关问题3.txt
[20171113]修改表结构删除列相关问题3.txt --//维护表结构删除字段一般都是先ALTER TABLE <table_name> SET UNUSED (<column_ ...
- Linux 查看对外开放端口
备忘命令: netstat -anpt | grep 514 # 查看 rsyslog tcp 端口是否开放 保持更新,转载请注明出处.
- 解决关于phpstorm打开速度很慢的问题
我的电脑是GTX950M , 8G 内存的 ,配置不算低但是打开phpstorm的速度非常的慢.基本上每次打开都要花一分钟以上,虽然打开sublime text3 只需要三四秒,但是phpstorm功 ...
- Django框架的使用教程--Cookie-Session[五]
Cookie cookie是存储在浏览器中的一段文本信息,下次同一网站请求,就会发送该cookie给服务器,一般的浏览器都有启动cookie,用cookie存储信息,最好不要存储密码,cookie也有 ...