博客
关于我
联赛模拟测试20 B. Walk (建图)
阅读量:428 次
发布时间:2019-03-06

本文共 1361 字,大约阅读时间需要 4 分钟。

题目描述

分析

一条边只会在枚举它因子作为答案时才有用

所以,我们考虑从 \(1\) 到最大值枚举答案 \(w\),把所有倍数是 \(w\) 的边连起来
在形成的森林中跑一个直径
这样相当于把每条边分成因子个数条边
注意,你不能一开始就建好图然后在枚举时打标记,这样你走的边会变多
时间复杂度 \(O(n\times \sqrt{n})\)

代码

#include
#include
#include
#include
#include
#include
#define rg registerinline int read(){ rg int x=0,fh=1; rg char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') fh=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*fh;}const int maxn=1e6+5;int n,h[maxn],tot=1,mmax;struct asd{ int to,nxt;}b[maxn];struct jie{ int zb,yb; jie(){} jie(int aa,int bb){ zb=aa,yb=bb; }};void ad(int aa,int bb){ b[tot].to=bb; b[tot].nxt=h[aa]; h[aa]=tot++;}std::vector
g[maxn];int ans[maxn],dis[maxn],sta[maxn],tp,vis[maxn],tim,maxdis,jl,jll;void dfs(int now,int fa){ vis[now]=tim; for(rg int i=h[now];i!=-1;i=b[i].nxt){ rg int u=b[i].to; if(u==fa) continue; dis[u]=dis[now]+1; if(dis[u]>maxdis){ maxdis=dis[u]; jl=u; } dfs(u,now); }}int main(){ freopen("walk.in","r",stdin); freopen("walk.out","w",stdout); memset(h,-1,sizeof(h)); n=read(); rg int aa,bb,cc; for(rg int i=1;i
mmax) mmax=cc; } for(rg int i=1;i<=mmax;i++){ tp=0; tot=1; tim++; for(rg int j=i;j<=mmax;j+=i){ for(rg int k=0;k
=1;i--){ ans[i]=std::max(ans[i],ans[i+1]); } for(rg int i=1;i<=n;i++){ printf("%d\n",ans[i]); } return 0;}

转载地址:http://kgpyz.baihongyu.com/

你可能感兴趣的文章
罗马数字
查看>>
IO多路复用小故事
查看>>
码云 Pages 搭建
查看>>
《论可计算数及其在判定上的应用》简单理解
查看>>
中国剩余定理证明过程
查看>>
java中Object.equals()简单用法
查看>>
poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)
查看>>
java中自动装箱的问题
查看>>
程序员的开发文档
查看>>
mybatis generator修改默认生成的sql模板
查看>>
算法 - 如何从股票买卖中,获得最大收益
查看>>
算法 - 链表操作思想 && case
查看>>
并发编程实战-ConcurrentHashMap源码解析
查看>>
C#之反射、元数据详解
查看>>
通俗易懂设计模式解析——单例模式
查看>>
通俗易懂设计模式解析——抽象工厂模式
查看>>
SSM商城项目(十二)
查看>>
第5章选择结构程序设计
查看>>
前端数据渲染及mustache模板引擎的简单实现
查看>>
设计模式系列之工厂模式三兄弟(Factory Pattern)
查看>>