树的直径
WerKeyTom_FTD
我是一只来自中山纪念中学高三的oier,请多多指教
展开
-
[51nod 1766]树上的最远点对
题目大意给定一棵树,m个询问每次询问从a~b选一个结点并从c~d选一个结点使这两个结点距离最大。结论根据树的直径性质我们得到一个结论: 一个集合中的直径两端点一定被分成两个非空集合后两条直径的四个端点包含。 于是线段树维护。 注意你求lca不能倍增,应该用RMQ求。 RMQ求LCA的方法:得到树的欧拉序与对应深度序,设fi[x]表示结点x最早出现在欧拉序中的位置。假若满足fi[x]<=z<=原创 2016-06-30 16:38:01 · 1365 阅读 · 0 评论 -
挺进
题目大意给出一颗边权树,问你删除一条边然后将两部分直径相加的最大值为多少。DP我们知道求直径的dp方法: f1[x]表示x往下走的最长链,f2[x]表示x往下走不与f1路径相交的最长链。 一颗树的直径长度=∑ni=1f1[i]+f2[i]\sum_{i=1}^nf1[i]+f2[i] 其中f1[i]+f2[i]表示在i的子树中,经过i的最长路径。 现在我们对于本题,一个子树内的直径,可以额外原创 2016-09-18 17:27:15 · 678 阅读 · 0 评论 -
Walk
题目大意给定一颗边权树,对于任意i求出f[i]表示一条长度为i的简单路径gcd的最大值。瞎做我们可以把每条边挂在其的约数上,使用质因数分解。 对每个gcd做一下,对保留的所有边构出新树,然后对于所有这些边涉及到的点形成的每个联通块用两遍dfs求直径,最终得到森林的最长链。 设最长链为k,当前枚举的gcd为v,则f[k]=max(f[k],v)f[k]=max(f[k],v) 这样做显然会错,但原创 2016-11-08 22:36:50 · 385 阅读 · 0 评论 -
[CodeM初赛A轮]D
题解用sqrt(a)/log a的时间分解质因数。 枚举一个质因数x,所有x的倍数节点打标记。 对于每一个被标记的联通块求直径。#include<cstdio> #include<algorithm> #include<map> #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; typedef long long ll; const原创 2017-06-18 22:18:59 · 644 阅读 · 3 评论 -
[agc005c]Tree Restoring
前言简单题,数据范围可能是吓人的。题目大意给你每个点到最远点的距离,求是否存在这样的一颗树。简单一个性质是每个点的最远点一定是直径的端点。 然后我们找出直径长度,要求能构造出这条直径(每种距离都有2个点,当然直径中心只需要1个)。 然后其余点都可以直接接在直径上,因此到最远点的距离不能少于直径长度的一半。 满足就能构造。#include<cstdio> #include<algorithm>原创 2017-10-31 10:31:44 · 645 阅读 · 0 评论