关闭

[CodeM初赛A轮]D

题解用sqrt(a)/log a的时间分解质因数。 枚举一个质因数x,所有x的倍数节点打标记。 对于每一个被标记的联通块求直径。#include #include #include #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; typedef long long ll; const...
阅读(217) 评论(3)

Walk

题目大意给定一颗边权树,对于任意i求出f[i]表示一条长度为i的简单路径gcd的最大值。瞎做我们可以把每条边挂在其的约数上,使用质因数分解。 对每个gcd做一下,对保留的所有边构出新树,然后对于所有这些边涉及到的点形成的每个联通块用两遍dfs求直径,最终得到森林的最长链。 设最长链为k,当前枚举的gcd为v,则f[k]=max(f[k],v)f[k]=max(f[k],v) 这样做显然会错,但...
阅读(113) 评论(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的最长路径。 现在我们对于本题,一个子树内的直径,可以额外...
阅读(141) 评论(0)

[51nod 1766]树上的最远点对

题目大意给定一棵树,m个询问每次询问从a~b选一个结点并从c~d选一个结点使这两个结点距离最大。结论根据树的直径性质我们得到一个结论: 一个集合中的直径两端点一定被分成两个非空集合后两条直径的四个端点包含。 于是线段树维护。 注意你求lca不能倍增,应该用RMQ求。 RMQ求LCA的方法:得到树的欧拉序与对应深度序,设fi[x]表示结点x最早出现在欧拉序中的位置。假若满足fi[x]<=z<=...
阅读(557) 评论(0)
    个人资料
    • 访问:211444次
    • 积分:9155
    • 等级:
    • 排名:第2014名
    • 原创:690篇
    • 转载:4篇
    • 译文:0篇
    • 评论:181条
    最新评论
    文章分类