Sirni题解(最小生成树,埃氏筛)(继 Liang-梁)
目录
前言
本篇是对Liang-梁的Sirni(最小生成树,埃氏筛)的后继博客。
通篇原文:https://blog.csdn.net/qq_37555704/article/details/97107653?tdsourcetag=s_pcqq_aiomsg
本文稍加修正,分析了一些错误。
题意
给你 n 个点,每个点有一权值 Pi,两点i,j的边权为min(Pi%Pj,Pj%Pi),求最小生成树。
数据范围:n<=1e5,Pi<=1e7
思路
以下是原文:
首先30分我们可以通过枚举两两连边后用 Kruskal 做,复杂度 O(n2logn2)
其实我们排序时还可以用类似桶排序的方法
用vector或者前向星存储边访问,但是还是会超时,却给我们正解提供思路,然后考虑正解,
我们记值域为 T=[1,1e7]
我们假设两个点 a,b 可以发现若 Pa≤Pb 那么取 min 时只可能取Pb%Pa
那我们如何决策呢首先我们可以将所有Pb=kPa 的点缩成一个点,保存最小的 Pa ,因为他们相连的代价为0,我们可以用类似埃氏筛的方法处理
然后场上所有 Pa,Pb 都是不同的且不存在倍数关系我们发现,算法瓶颈在于边太多了,于是考虑减少边的数量(即可以判断一些不会选的边提前去除), 怎么做呢
假设有三个点 a,b,c 满足 Pa < Pb < Pc并且 Pb=k∗Pa+s,Pc=k∗Pa+t(0< s <Pa) 那 a,b 连边代价为 s ; a,c连边代价为 t ;b,c 连边代价 q 虽然不知道是多少但有一个范围即 :0≤q≤t−s
给这三个点连边只有三种情况:1.a−b−c
代价w1:s+q , s≤w1≤t
2.b−a−c
代价w2: s+t,w2=s+t
3.a−c−b
代价 w3:t+q,t≤w3≤2∗t−s于是w<min(w2,w3)w1<min(w2,w3),k一定时,对于a,ab连边是最优的, b-c这条边我们会在对于b考虑时决策我们记 f(i,k) 表示
那我们发现就只把 k 枚举一遍找到最小一个满足Px=k∗Pa+s(0<s<Pa)的Px,i,x 连边即可
那么问题转化为 将P 数组在值域为[1,1e7]中bool标记,后对于一个值 x 快速找到在它右侧第一个出现的值,那么从右至左简单的Dp扫一遍即可
后面用 30分的第2种做法即可分析一下,由于 Pi 互不相同,那么枚举Pi的倍数时我们的边上限为 Tloglogn类似埃氏筛的时间复杂度,于是桶排序访问时间复杂度为 O(n+T)
那么总的时间复杂度为 O(Tloglogn)
相信大家仔细想想就会发现,若是强制缩点,一些数据是过不了的。
若是有Pj是Pi倍数的话,相当于 i 和 j 有一条权值为零的边,这样的边无论多连几条都没有关系,所以不如就把所有这样的边都先连上,然后再判断权值非零的边。
强制缩点指在上述边都连上情况下,把所有连通的点(无向,所以只要有边就连通)都 蹂 揉成一个点,也就是说,被缩进去的点的权值都不存在了,原作者认为这不影响边的判断。
但是,随便来一组数据就过不了,比如
4
6 18 9 7
若是缩点,最后就缩成了6,9,7,算出来是 3。实际上依次连 9——18——6——7最小,答案是1。
一些建议
要打这道题的人,给些建议:
- 卡常之类的不要过火,走错方向了。
- 用Kruskal做时,不要用优先队列,不要用vector,用数组+sort就行。
- 算DP时,最右边最大的DP值为inf。
Sirni题解(最小生成树,埃氏筛)(继 Liang-梁)的更多相关文章
- 埃氏筛优化(速度堪比欧拉筛) + 洛谷 P3383 线性筛素数 题解
我们一般写的埃氏筛消耗的时间都是欧拉筛的三倍,但是欧拉筛并不好想(对于我这种蒟蒻) 虽然 -- 我 -- 也可以背过模板,但是写个不会的欧拉筛不如写个简单易懂的埃氏筛 于是就有了优化 这个优化还是比较 ...
- 「CF779B」「LOJ#10201.」「一本通 6.2 练习 4」Sherlock and His Girlfriend(埃氏筛
题目描述 原题来自:Codeforces Round #400 B. Sherlock 有了一个新女友(这太不像他了!).情人节到了,他想送给女友一些珠宝当做礼物. 他买了 nnn 件珠宝.第 iii ...
- U138097 小鱼吃大鱼 埃氏筛
题目描述 小P同学在养殖一种非常凶狠的鱼,而且与其他鱼类不同,这种鱼越大越温顺,反而小鱼最凶残.当两条鱼相遇时, 小鱼会不断撕咬大鱼,每一口都咬下与它自身等重的肉(小鱼保持体重不变),直到大鱼的体重小 ...
- CodeForces - 385C Bear and Prime Numbers (埃氏筛的美妙用法)
Recently, the bear started studying data structures and faced the following problem. You are given a ...
- cf1154G 埃氏筛应用
直接用埃氏筛也可以做,但是这题写起来有点恶臭.. 更加简单的写法是直接枚举gcd=k,然后里面再枚举一次i*k,即找到k两个最小的倍数,看起来复杂度很高,但其实也是埃氏筛的复杂度 因为每次枚举gcd, ...
- [JXOI 2018] 游戏 解题报告 (组合数+埃氏筛)
interlinkage: https://www.luogu.org/problemnew/show/P4562 description: solution: 注意到$l=1$的时候,$t(p)$就 ...
- 埃氏筛+线段树——cf731F
从2e5-1依次枚举每个数作为主显卡,然后分段求比它大的数的个数,这里的复杂度是调和级数ln2e5,即埃氏筛的复杂度.. #include<bits/stdc++.h> using nam ...
- 数论(8):min_25 筛(扩展埃氏筛)
min_25 筛介绍 我们考虑这样一个问题. \[ans=\sum_{i = 1}^nf(i)\\ \] 其中 \(1 \le n \le 10^{10}\) 其中 \(f(i)\) 是一个奇怪的函数 ...
- hdu.5212.Code(莫比乌斯反演 && 埃氏筛)
Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
随机推荐
- iPhone x 的区别
最近入手两台iPhone x, 均从官网购买,两台分别是2017年和2018年生产,对比了一下,两台还有是一些差别: 首先苹果X使用起来还是非常爽的,没有HOME键,明显比按HOME键方便,因为按HO ...
- 当JAVA注解、AOP、SpEL相遇,更多可能变为了现实
常规情况下,我们可以通过业务定制化的注解,借助AOP机制来实现某些通用的处理策略.比如定义个@Permission注解,可以用于标识在具体的方法上,然后用来指定某个方法必须要指定角色的人才能够访问调用 ...
- element ui 自定义主题失败(primordials is not defined)
卸载: 1.卸载cnpm npm uninstall cnpm -g 2.卸载vue-cli npm uninstall @vue/cli -g 3.卸载nodejs和删除文件 C:\Program ...
- Redis docker 主从模式与哨兵sentinel
更多技术记录,请参考软件开发 | 编程 | RustFisher 为实现redis的高可用,我们采用主从模式加哨兵的方法. 一主二从三哨兵,共启动6个redis容器.本文示例在同一个服务器上进行操作. ...
- 零基础学Java(3)运算符
运算符 运算符用于连接值.Java提供了一组丰富的算术和逻辑运算符以及数学函数. 算术运算符 在Java中,使用算术运算符+.-.*./表示加.减.乘.除运算.当参与/运算的两个操作数都是整数时,表示 ...
- java-数据输入,分支结构
数据输入 1.Scanner使用的基本步骤" 导包:import java.util.Scanner;(导包的动作必须出现在类定义的上边) 创建对象:Scanner sc = new Sca ...
- 跟HR在大群吵架是什么体验?
原创不易,求分享.求一键三连 昨天跟HR负责人在公司大群吵了一架,先说结论:我输了... 事情原委是,老板在周一司庆上聊嗨了,说了一句:我觉得打卡没用,建议取消打卡. 下来后老板在公司论坛发了一个问题 ...
- 07 MySQL_SQL语言分类
SQL语言分类 DDL Data Definition Language 数据定义语言 包括: create , alter ,drop , truncate; 不支持事务 DML Data Mani ...
- 【一本通提高博弈论】[ZJOI2009]取石子游戏
[ZJOI2009]取石子游戏 题目描述 在研究过 Nim 游戏及各种变种之后,Orez 又发现了一种全新的取石子游戏,这个游戏是这样的: 有 n n n 堆石子,将这 n n n 堆石子摆成一排.游 ...
- idea的使用技巧和必要的设置
idea 如何开启多个线程 打开下面按钮,然后运行相同的代码即可 打开idea需要选择打开哪一个项目 * 设置如下,关闭下面选项即可