题目大意

给你n个点,每个点有权值pip_i,一个点x和y连边的费用是min(px%py,py%px)min(p_x\%p_y,p_y\%p_x),求原图最小生成树的费用。
n<=100000,pi<=107p_i,时限7秒开O2。

分析

这道题乍地一看只会O(n2)O(n^2)的做法,而一般这种题就是优化边数然后用经典做法。
研究一下边费用的特征,发现肯定是大的模小的更小。两个p相同的点,直接并成1个点即可。
考虑p的值域只有10710^7,我们尝试有关倍数的方法。
对于一个点x,我考虑他跟p更大的连边,大胆尝试把最接近px+1,2px,3px...p_x+1,2p_x,3p_x...的点和他的边都记录下来,然后连起来。然后就会发现这样连边不会漏掉最优解的任何一条边。
如何证明呢?考虑apx和(a+1)pxap_x和(a+1)p_x之间的那些点,假如从小到大为b1,b2...bmb_1,b_2...b_m。我们没有必要让x和除了b1b_1的其他点连。
反证法:我们给x和b1和bkb_1和b_k都连。按照刚刚的方法b之间两两都有连边。那么x和bkb_k的边费用是pbk%pxp_{b_k}\%p_x的,然而让x和b1,b1和b2…b_k-1和b_k都连边的费用也是这么大,这条边显然没什么用。
正确性证完了,我们分析一下这样的边数多少。弄一个松一点的上界:∑ni=1107/i=107∑ni=11/i≈107×ln(n)\sum_{i=1}^n 10^7/i=10^7\sum_{i=1}^n 1/i\approx 10^7\times ln(n)。实际上是远远达不到这个大小的,放心地开够空间限制大小的边集数组,排序用桶排,或者直接插进链表里,就可以过了。

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
typedef double db;
#define fo(i,j,k) for(i=j;i<=k;i++)
#define fd(i,j,k) for(i=j;i>=k;i--)
#define cmin(a,b) (a=(a<b)?a:b)
#define cmax(a,b) (a=(a>b)?a:b)
const int N=1e5+5,M=1e7+2e6+5;
struct rec
{int x,y;
}b[M*3];
int a[N],fa[N],i,j,tb,n,ri[M],mx,pd[M],tmp,lst,x,fst[M],nxt[M*3],b1[M*3],p,tt,k;
ll ans;
void cr(int x,int y)
{tt++;b1[tt]=y;nxt[tt]=fst[x];fst[x]=tt;
}
int get(int x)
{if (fa[x]==x) return x;return fa[x]=get(fa[x]);
}
int main()
{freopen("t3.in","r",stdin);
//  freopen("autosadism.out","w",stdout);scanf("%d",&n);fo(i,1,n){scanf("%d",a+i);cmax(mx,a[i]);pd[a[i]]=i;} fd(i,mx,1){if (pd[i]) tmp=i;ri[i]=tmp;}fo(i,1,mx){if (pd[i]){lst=0;for (j=i;j<=mx;j+=i){x=ri[j+(i==j)];if (x!=lst){cr(x%i,++tb);b[tb].x=pd[i];b[tb].y=pd[x];lst=x;}}}}fo(i,1,n) fa[i]=i;fo(k,0,mx){for(p=fst[k];p;p=nxt[p]){i=b1[p];if (get(b[i].x)!=get(b[i].y)){ans+=k;fa[get(b[i].x)]=get(b[i].y);}}}printf("%lld",ans);
} 

[JZOJ5445]失格相关推荐

  1. JZOJ5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  2. [JZOJ5445]【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  3. JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  4. 生而为人,我很抱歉 ——《人间失格》

    版权声明:未经允许,随意转载,请附上本文链接谢谢(づ ̄3 ̄)づ╭❤- https://blog.csdn.net/xiaoduan_/article/details/80432370 生而为人,我很抱 ...

  5. 从刘强东到刘立荣:一号人物失格

    当京东的刘强东和金立的刘立荣被公众一块提起,你就知道他们要探讨些什么了--对于一个企业的"头号人物"来说,负面新闻并不仅仅对他们个人造成影响,他们的企业所受打击更甚.往往企业家的人 ...

  6. JZOJ 5445 失格

    失格 来自CzyCzy大佬的题目 Description 给出nn个点,每一个点有一个点权pip_i,现在要用nn-11条边将这nn个点连成一个连通块,连接(ii,jj)这一条边的代价为minmin( ...

  7. 读《猫城记》 | 人间失格

    猫城记是老舍先生在1932年完成的一部科幻讽刺小说,故事是老舍先生梦到自己乘坐飞船到火星,结识到当地一种智慧生物--猫人,进而了解到猫人的社会现状,失格的经济.教育.政治,直到猫人国灭亡,返回地球. ...

  8. 《人间失格》(书感)

    上周读了<人间失格>,趁热写一下感受 第一印象 为什么一个没有希望,没有未来的人会写出这样的文字?好像一个丧家犬在讲故事,没有常规作家超脱一般的感觉. 第二印象 读完全书,就好像有一个满身 ...

  9. 读书有益——》【20190614,人间失格】

    版权声明:本文为博主原创文章,无需授权即可转载,甚至无需保留以上版权声明,转载时请务必注明作者. https://blog.csdn.net/weixin_43453386/article/detai ...

最新文章

  1. 微软(中国)CTO韦青:人工智能是拿来用的,不是拿来炒的
  2. 周四话运营:如何提高用户留存?
  3. Google发布TCC 更好的理解视频中事件逻辑
  4. python tkinter控件_Python3 tkinter基础 Label pack 设置控件在窗体中的位置
  5. 鸿蒙公测报名表填写,鸿蒙2.0公测报名审核要多久_鸿蒙2.0公测报名审核时间
  6. linux学习笔记:磁盘格式化与磁盘检验命令
  7. redis mysql 雪崩_Redis缓存雪崩、缓存穿透、并发等5大难题,你有没有解决方案
  8. C# socket编程TcpClient与TcpListener UdpClient
  9. SVN的学习和使用(七)——SVN提交操作
  10. eclipse中编译java_eclipse编译java文件
  11. 架构之美第九章-架构与设计
  12. 计算机插u盘的接口通常是,在计算机上插u盘的接口是什么标准接口
  13. C语言error2005,关于ERROR LNK 2005错误
  14. 计算机网络练习题-4
  15. ModSecurity的规则
  16. Domain Adaptation 简介
  17. 解决 Error starting userland proxy: listen tcp 0.0.0.0:6379: bind: address already in use
  18. 家用台式计算机硬件配置清单,台式电脑组装配置清单
  19. smbd of samba-3.0.23b internal
  20. 计算机开始菜的mstsc命令,Win10一周年更新版系统CLSID(GUID)汇总

热门文章

  1. 【渝粤教育】国家开放大学2018年秋季 0686-22T广告创意与表现(一) 参考试题
  2. vue引用iconfont图标
  3. GCP认证考试之Storage专题
  4. 空间数据+AI,让建筑学会自己“思考”
  5. 传感器与测试技术-基于MATLAB的二阶系统固有频率和阻尼测量方法
  6. 网格系统高级进阶,很好懂
  7. 「免费版Axure」原型设计工具!
  8. 2023年FOF/MOM基金研究报告
  9. 用Python编写一个电子考勤系统
  10. App Deploy as Code! SAE Terraform 实现 IaC 式部署应用