P8207 [THUPC2022 初赛] 最小公倍树 题解
题目大意
有编号为
解题思路
我们有一个结论: 对于张图
那么我们考虑找一些可能是答案的边出来跑最小生成树。
对于一个
所以我们可以对于一个点
时间复杂度:
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
ll x,y,w;
}e[11000000];
ll L,R,ans,m,fa[1100000];
bool cmp(node x,node y)
{return x.w<y.w;}
ll find(ll x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
signed main()
{
scanf("%lld%lld",&L,&R);
for(ll i=1;i<=R;i++){
for(ll j=i;j<=R;j+=i){
if(j>=L){
ll p=(L+i-1)/i*i;
if(p==j)continue;
e[++m]=(node){j,p,j*p/i};
}
}
}
sort(e+1,e+1+m,cmp);
for(ll i=L;i<=R;i++)fa[i]=i;
for(ll i=1;i<=m;i++){
ll x=find(e[i].x),y=find(e[i].y);
if(x==y)continue;
ans+=e[i].w;fa[x]=y;
}
printf("%lld\n",ans);
return 0;
}
本文作者:BadBadBad__AK
本文链接:https://www.cnblogs.com/BadBadBad/p/18149568/P8207
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步