正题

题目链接:https://www.luogu.com.cn/problem/P8207


题目大意

有编号为[L,R][L,R][L,R]区间的点,连接两个点x,yx,yx,y边权的为LCM(x,y)LCM(x,y)LCM(x,y),求这张图的最小生成树。

1≤L≤R≤106,R−L≤1051\leq L\leq R\leq 10^6,R-L\leq 10^51≤L≤R≤106,R−L≤105


解题思路

我们有一个结论: 对于张图GGG中的一个生成子图EEE,EEE之中的一条边kkk如果不在EEE最小生成树中,那么kkk肯定也不在GGG的最小生成树中。

那么我们考虑找一些可能是答案的边出来跑最小生成树。

对于一个iii我们提取出所有它倍数的点,对于点ikikik来说它肯定不会去连接某个ik′ik'ik′如果存在另一个更小的ik′′ik''ik′′的话,因为这条边显然不在这张图的最小生成树中。

所以我们可以对于一个点xxx的每个约数ddd,我们只连接一个最小的d×kd\times kd×k,然后把这些边拿出来跑KruskalKruskalKruskal就好了。

时间复杂度:O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#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;
}

P8207-[THUPC2022 初赛]最小公倍树【Kruskal】相关推荐

  1. C++求最小公倍數LCM的实现算法(附完整源码)

    C++求最小公倍數LCM的实现算法 C++求最小公倍數LCM的实现算法完整源码(定义,实现,main函数测试) C++求最小公倍數LCM的实现算法完整源码(定义,实现,main函数测试) #inclu ...

  2. ZZULIOJ 1063:最大公约与最小公倍

    最大公约与最小公倍 题目描述 输入两个正整数,输出其最大公约数和最小公倍数. 输入 输入两个正整数n和m(n,m<=1000000).输入保证最终结果在int范围内. 输出 输出两个整数,用空格 ...

  3. 醉林疯的OJ 1063: 最大公约与最小公倍

    1063: 最大公约与最小公倍 题目描述 输入两个正整数,输出其最大公约数和最小公倍数. 输入 输入两个正整数n和m(n,m<=1000000).输入保证最终结果在int范围内. 输出 输出两个 ...

  4. 1360: 最大公约与最小公倍

    1360: 最大公约与最小公倍 1.描述 输入两个正整数,输出其最大公约数和最小公倍数. 输入 输入两个正整数n和m(n,m<=1000000).输入保证最终结果在int范围内. 输出 输出两个 ...

  5. 【BZOJ4833】最小公倍佩尔数(min-max容斥)

    [BZOJ4833]最小公倍佩尔数(min-max容斥) 题面 BZOJ 题解 首先考虑怎么求\(f(n)\),考虑递推这个东西 \((1+\sqrt 2)(e(n-1)+f(n-1)\sqrt 2) ...

  6. 【ZZULIOJ】1063: 最大公约与最小公倍

    ZZULIOJ题解 1063: 最大公约与最小公倍 题目描述 输入两个正整数,输出其最大公约数和最小公倍数. 输入 输入两个正整数n和m(n,m<=1000000).输入保证最终结果在int范围 ...

  7. 1063: 最大公约与最小公倍 ZZULIOJ

    1063: 最大公约与最小公倍 题目描述 输入两个正整数,输出其最大公约数和最小公倍数. 输入 输入两个正整数n和m(n,m<=1000000).输入保证最终结果在int范围内. 输出 输出两个 ...

  8. 最小公倍数 求两个数字的最小公倍数是很常见的运算。比如,3和5的最小公倍是15。6和8的最小公倍数是24。

    /* 最小公倍数 求两个数字的最小公倍数是很常见的运算.比如,3和5的最小公倍是15.6和8的最小公倍数是24. 下面的代码对给定的两个正整数求它的最小公倍数.请填写缺少的代码,使程序尽量高效地运行. ...

  9. mysql最大公约数函数_求最大公约数和最小公倍(PHP)

    求最大公约数和最小公倍(PHP) 用程序求最大公约数和最小公倍数最容易想到的方法如下: //求最大公约数 function max_divisor($a, $b) { $n = min($a, $b) ...

最新文章

  1. 有福了,J2EE面试题集锦(附答案)
  2. 源码安装nginx开启SSL功能
  3. 使用 Spring Boot Operator 部署 Spring Boot 到 Kubernetes
  4. [转]浅谈:国内软件公司为何无法做大做强
  5. html input image 尺寸,HTML DOM Input Image 对象
  6. Python小知识: List的赋值方法,不能直接等于
  7. 程序员开发利器:源代码管理的十条建议
  8. Redis的事务:相关命令 watch 与mysql事务的区别
  9. 六、springboot(三)配置双数据源
  10. 删除当前文件夹下特定名称文件
  11. DynamoRIO工作原理
  12. java栈与堆_JAVA中的栈和堆
  13. java开发总结_java开发几点总结
  14. 使用复合数据类型——PL/SQL记录表
  15. 算法:回溯十七 Combination Sum III挑选数组中规定个数元素的和为指定数
  16. Jupyter Notebook的使用02—两种模式的快捷操作
  17. 1200,1500PLC通过将FB284封装成一个标准FB块控制V90PN伺服EPOS定位
  18. 【NOIP2016普及组复赛模拟赛】买装备(equipment)
  19. Translation QA 检查
  20. 移动端300ms延迟_移动端300ms延迟原因及解决方案

热门文章

  1. 作业优先调度java代码_如何在触发它时在java代码中为hadoop作业设置优先级?
  2. 计算机视觉领域还有那些坑,深度学习/计算机视觉常见的8个错误总结及避坑指南...
  3. java dos编译命令是什么_在DOS命令行状态下,如果源程序HelloWorld.java在当前目录下,那么编译该程序的命令是()...
  4. c语言中文件如何插入数据,急求如何将下列C语言程序数据存储到文件中?
  5. css less 不要作用到子对象_使用Less实现网站主题切换
  6. css3边框交替动画_用css3实现惊艳面试官的背景即背景动画(高级附源码)
  7. [MyBatisPlus]代码生成器
  8. [mybatis]映射文件_参数处理_#取值时指定参数相关规则
  9. [MySQL基础]MySQL语法规范介绍
  10. UVA - 548 Tree