看到要求gcd不为1所以肯定在这条答案链上都是一个质数的倍数,所以就会产生一个很暴力的想法

没错,正解就是这样的暴力

只让走是i(素数)倍数的点,作最长链

最长链可以树形dp或两遍bfs,一遍找端点,一遍过长度即可

复杂度:未证

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
inline int read()
{
int f=,ans=;char c;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
map<int,int> ma;
struct node{
int u,v,nex;
}x[];
int cnt,n,head[];
void add(int u,int v)
{
x[cnt].u=u,x[cnt].v=v,x[cnt].nex=head[u],head[u]=cnt++;
}
int v[],sry,have[];
int vis[];
int dis[];
vector<int> ve[];
int vis1[];
int maxn;
int bfs(int u)
{
queue<int> que;
int ans=u;
que.push(u);
vis[u]=,dis[u]=;
while(!que.empty())
{
int xx=que.front();que.pop();
for(int i=head[xx];i!=-;i=x[i].nex)
{
if(have[x[i].v]==) continue;
if(vis[x[i].v]) continue;
vis[x[i].v]=;
dis[x[i].v]=dis[xx]+;
if(dis[x[i].v]>dis[ans]) ans=x[i].v;
que.push(x[i].v);
}
}
while(!que.empty()) que.pop();
que.push(ans),vis1[ans]=,dis[ans]=;
while(!que.empty())
{
int xx=que.front();que.pop();
for(int i=head[xx];i!=-;i=x[i].nex)
{
if(have[x[i].v]==) continue;
if(vis1[x[i].v]) continue;
dis[x[i].v]=dis[xx]+;
vis1[x[i].v]=;
if(dis[x[i].v]>dis[ans]) ans=x[i].v;
que.push(x[i].v);
}
}
return dis[ans];
}
int main()
{
memset(head,-,sizeof(head));
n=read();
for(int i=;i<n;i++)
{
int u=read(),v=read();
add(u,v),add(v,u);
}
for(int i=;i<=n;i++) v[i]=read();
for(int i=;i<=n;i++)
{
int x=v[i];
for(int j=;j<=sqrt(x);j++)
{
if(x%j!=) continue;
if(ma[j]==) ma[j]=++sry;
ve[ma[j]].push_back(i);
while(x%j==) x/=j;
}
if(x!=)
{
if(ma[x]==) ma[x]=++sry;
ve[ma[x]].push_back(i);
}
}
for(int i=;i<=sry;i++)
{
int size=ve[i].size();
for(int j=;j<size;j++) have[ve[i][j]]=,vis[ve[i][j]]=,vis1[ve[i][j]]=;
for(int j=;j<size;j++)
{
if(vis[ve[i][j]]==) continue;
maxn=max(maxn,bfs(ve[i][j]));
}
for(int j=;j<size;j++) have[ve[i][j]]=,vis[ve[i][j]]=,vis1[ve[i][j]]=;
}
cout<<maxn;
}

[LOJ 6159] 最长树链的更多相关文章

  1. 「美团 CodeM 初赛 Round A」最长树链

    题目描述 Mr. Walker 最近在研究树,尤其是最长树链问题.现在树中的每个点都有一个值,他想在树中找出最长的链,使得这条链上对应点的值的最大公约数不等于1.请求出这条最长的树链的长度. 输入格式 ...

  2. newcoder-最长树链-树/gcd

    https://ac.nowcoder.com/acm/problem/13233 链接:https://ac.nowcoder.com/acm/problem/13233来源:牛客网 题目描述 树链 ...

  3. [美团 CodeM 初赛 Round A]最长树链

    题目大意: 给你一棵带点权的树,找出一个最长的树链满足链上点权的最大公因数不为1. 思路: 暴力DP. 对于每个点,记录一下以这个点为一个端点的所有链的最大公因数及长度. 然后暴力转移一下,时间复杂度 ...

  4. CodeM资格赛 Round A 最长树链

    按照题解的做法,对于每一个质约数分别进行讨论最长链就行 对于每一个数的质约数可是比logn还要小的 比赛的时候没人写,我也没看 = =,可惜了,不过我当时对于复杂度的把握也不大啊 #include & ...

  5. 【填坑】loj6159. 「美团 CodeM 初赛 Round A」最长树链

    水一水 枚举各个质数,把是这个数倍数的点留下,跑直径,没了 #include <bits/stdc++.h> using namespace std; int h,t,n,p,q,M,N; ...

  6. 树链剖分-点的分治(点数为k且距离最长的点对)

    hdu4871 Shortest-path tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 130712/130712 K ( ...

  7. LOJ#139. 树链剖分

    LOJ#139. 树链剖分 题目描述 这是一道模板题. 给定一棵$n$个节点的树,初始时该树的根为 1 号节点,每个节点有一个给定的权值.下面依次进行 m 个操作,操作分为如下五种类型: 换根:将一个 ...

  8. 树链剖分 (求LCA,第K祖先,轻重链剖分、长链剖分)

      2020/4/30   15:55 树链剖分是一种十分实用的树的方法,用来处理LCA等祖先问题,以及对一棵树上的节点进行批量修改.权值和查询等有奇效. So, what is 树链剖分? 可以简单 ...

  9. 【loj#139】树链剖分

    #139. 树链剖分 题目描述 这是一道模板题. 给定一棵 $n$个节点的树,初始时该树的根为 111 号节点,每个节点有一个给定的权值.下面依次进行 $m$ 个操作,操作分为如下五种类型: 换根:将 ...

随机推荐

  1. lesson 14 A noble gangster

    lesson 14 A noble gangster there was a ++time++ 时期 times 时期/年代 in times of peace a sum of + money 一笔 ...

  2. <cfenv>(fenv.h) _c++11

    头文件 <cfenv>(fenv.h) c++11 浮点环境 这个头文件声明了一系列的函数和宏去访问浮点环境,以及特殊的类型. 浮点环境维护一系列的状态标志(status flags)和具 ...

  3. Unity编辑器 - Undo的坑

    Unity编辑器 - Undo的坑 编辑器通过脚本中改变值,Undo.RecordObject可能会无效,应该使用: Undo.RegisterCompleteObjectUndo(Object ob ...

  4. Java初始化方法:类、容器

    Java初始化方法:类.容器   初始化类(非final): Struts2的DefaultActionMapper类中:      public DefaultActionMapper() {   ...

  5. JVM之G1收集器

    Garbage-First,面向服务端的垃圾收集器. 并行与并发:充分利用多核环境减少停顿时间, 分代收集:不需要配合其它收集器 空间整合:整体上看属于标记整理算法,局部(region之间)数据复制算 ...

  6. C 判断成绩是否及格

    #include <stdio.h> int main(int argc, char **argv) { // 新建两个变量  pass代表及格分数的固定变量 score代表学生成绩的一个 ...

  7. Response对象及常用方法

    void addCookie(Cookie cookie)给客户端添加一个Cookie对象,以保存客户端的信息 void addDateHeader(String name,long value) 添 ...

  8. SVG Sprite 使用Symbol元素制作ICON

    介绍 SVG是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法.之前写过两篇关于CSS icon在页面显示的博客,后来了解到现在大多数前端团队和项目都在使用SVG Sprite这种方 ...

  9. LeetCode 138——复制带随机指针的链表

    1. 题目 2. 解答 第一次遍历链表的时候,复制旧链表的节点值建立一个新的链表,同时定义一个 unordered_map 作为哈希表,哈希表的键为旧链表的节点指针,值为新链表的节点指针. 然后,第二 ...

  10. NMAP-主机扫描

    1.全面扫描 2.扫描指定段 3.ping扫描 只进行ping操作,十分隐蔽 4.无ping扫描 适用于防火墙禁止ping 5.TCP SYN扫描 6.TCP ACK扫描 7.UDP扫描 8.ICMP ...