首页 > 其他分享 >AT_cf17_final_j 题解

AT_cf17_final_j 题解

时间:2024-01-13 16:45:49浏览次数:37  
标签:cf17 题解 边权 最小 生成 lca 树中 final dis

题意

给定一棵既有点权也有边权的树,构造一个完全图,图中两点间边的边权为树中两点点权之和加上两点间的距离,求该图的最小生成树。

思路

发现完全图总边数太大,考虑减少边数。

这里有一个性质:

如果在一个图中选取任意个联通的边集,使得它们的并为全集,则整个图的最小生成树中的边一定在 分割后的两个边集的最小生成树中出现。

证明:

假设有一条边 \((u,v)\) 在全图的最小生成树中却不在分割后的边集中,那么在包含 \((u,v)\) 的边集中一定存在一条连接 \((u,v)\) 的链,而这一定不比 \((u,v)\) 劣,否则 \((u,v)\) 一定可以替换这条链中的某一条边而成为最小生成树的一部分。

考虑优化建边:对于树上每个点,我们要让在新图中的包含这个点的边期望不超过 \(O(\log n)\) 条,才能够求整个图的最小生成树。

记 \(u\) 的点权为 \(w_u\),\(u\) 和 \(v\) 在树上的距离为 \(dis_{u,v}\)

那么 \(u\) 和 \(v\) 在完全图中的边权就为 \(w_u + w_v + dis_{u,v}\)。

发现这个式子不是很对称,考虑把 \(dis_{u,v}\) 拆了。

考虑从最近公共祖先处拆,此时这个式子可以写成 \(w_u + dis_{u,lca} + w_v + dis_{v,lca}\),最小生成树显然是从 \(w_u + dis_{u,lca}\) 最小的 \(u\) 连向其他点,至于两个点在同一个子树内的情况,则会在该子树中算出更小的边权,不会影响答案。

但这样最坏复杂度还是 \(O(n^2)\) 的,考虑换个位置差:点分树上最近公共祖先,这样复杂度就是 \(O(n\log n)\) 的。

所以最终做法为:跑点分治,对于每个子树建完边后跑一边最小生成树即可。

标签:cf17,题解,边权,最小,生成,lca,树中,final,dis
From: https://www.cnblogs.com/BINYU/p/17962544

相关文章

  • [AGC022F] Checkers 题解
    题目链接点击打开链接题目解法很妙的题!!!考虑\(x\)是无穷大的数,所以可以认为\(x^i\)的系数是单独的一项,不会和\(x^j(j\neqi)\)合并所以问题转化成了:每个数初始是\(x^i\)(\(x\)可以理解是元),进行题目中的操作,问最后形成的\(n\)次多项式的个数由\(B\)向\(A\)连边,这......
  • CF1006E Military Problem 题解
    CF1006EMilitaryProblem题解题意给定一颗有\(n\thinspace(2\leqn\leq2\times10^5)\)个节点的树,树根为\(1\)。对于每个节点\(i\thinspace(2\leqi\leqn)\)都有它的父节点\(p_i\),并且每个节点的子节点都是按从小到大的顺序排列的的。有\(q\thinspace(1......
  • 【题解】CatOJ C0458C 滑动窗口定期重构
    标题trick的名字我也不知道是什么,就这样吧。link。首先有显然的dp式子:\(f(i)=\min\{f(j)\times\max\{a_{j+1},\dots,a_i\}\}\)。考虑怎么去优化它。有显然的\(\mathcalO(n\logn)\):考虑线段树优化dp。用增的单调栈维护\(a\),若每次弹出顶部一个下标\(p\),则\([p+1,i......
  • 1.11模拟赛 T1题解
    简要题意\(n\le10^3,\sumK_i\le3\times10^5\)思路首先容易想到一个暴力DP,\(f_{l,r,x}\)表示区间中最大值为\(x\)的最大值稍微想亿下可以发现如果这个位置选的不是区间最大值的话,答案一定不优所以我们可以直接\(f_{l,r}\)DP转移,但复杂度还是没变,我们把柿子列出来\(......
  • AT_joisc2018_b 题解
    AT_joisc2018_b题解传送门题意有一个以原点为中心的正方形,有\(n(n\le100)\)条不在正方形内部的线段,你需要画一些不在正方形内部的线段,使得这些线段可以把正方形围起来,要求最小化你画的线段的长度和。思路我们需要画出一条闭合折线,并且能够把正方形包围。考虑我们一定是......
  • 1.11模拟赛 T2题解
    简要题意每个点有一定概率向前面的点连边,求两点之间距离的期望思路推柿子code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineN1000005intn,m,u,v;constintmod=1e9+7;inta[N],sum[N],c[N],dep[N],s[N],f[N],g[N],h[N];intksm(intx......
  • P4103 [HEOI2014] 大工程 题解
    题目链接:大工程先考虑只有一次查询,很显然我们可以暴力树上dp处理出答案。对于每个节点而言,有:容易看出类似点分治逐个遍历子树计算前面一堆子树对后面子树的贡献思想,我们可以很容易的知道:对于路径总和,显然多了一段新的贡献,这段贡献为当前关键点和前面点多的一段\(2\)号路......
  • 26-final关键字
     publicclassFinalDemo{publicstaticvoidmain(String[]args){Zizi=newZi();zi.method();zi.method2();}}classFu{publicvoidmethod(){System.out.println("父类中非常重要的方法,不希望子类进行修改");......
  • 《算法竞赛》题解---三分
    三分法模板三分法#include<bits/stdc++.h>#defineeps1e-8//或者constdoubleeps=1e-8;--主要是doubleusingnamespacestd;intn;doublea[15],l,r;doublecheck(doublex){ doubleans=0; for(inti=n;i>=0;i--) ans=ans*x+a[i];//秦九韶公式 returnans;}......
  • P4093 [HEOI2016/TJOI2016] 序列 题解
    题目链接:序列对于LIS问题,很显而易见的有dp方程为:\[dp_i=\max{dp_j}+1\(j<i,a_j\lea_i)\text{dp表示以某个位置结尾的最长LIS}\]本题考虑到对于转移的两位置,如果能从\(j\rightarrowi\),那么在以上条件成立的基础情况下,我们由于可以更改二者中的任意一个值(因为同一......