看到要求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. Qt-序列号生成器

    一直想做一个序列号的生成器,今天终于有了开始了,目前只有读取硬件生成,还没有做生成序列号的规则. 目前实现的功能就是读取系统磁盘卷加上CPU ID 和自己的加密字符串,在利用MD5加密,转换成标准32 ...

  2. Ubuntu14.04 panic --not syncing: Attempt to kill init 解决方法

    Ubuntu14.04 panic --not syncing: Attempt to kill init 解决方法 工作电脑装了一个虚拟机玩玩,胡乱下载了一些软件,apt-get了不少操作,后来重启 ...

  3. 【cookie接口】- jmeter - (请求提示no cookie)

    1.虽然 请求成功 响应码 200  ,但是  返回code 1  ,表示接口不成功 2.加入 空的cookie 管理器就可以了  返回 code 0 注意:状态码 200 只是表示请求是成功的 , ...

  4. Jedis 与 MySQL的连接线程安全问题

    Jedis的连接是非线程安全的 下面是set命令的执行过程,简单分为两个过程,客户端向服务端发送数据,服务端向客户端返回数据,从下面的代码来看:从建立连接到执行命令是没有进行任何并发同步的控制 pub ...

  5. 2019寒假训练营寒假作业(二) MOOC的网络空间安全概论笔记部分

    视频课程--MOOC的网络空间安全概论笔记 第一章 网络空间安全概述 2001年,网络空间概念被首次提出: 网络空间安全框架: 1.设备层安全: 可通过截获电磁辐射获取计算机信息.通过硬件木马(恶意电 ...

  6. 分布式系统理论-terms

    Distributed programming is the art of solving the same problem that you can solve on a single comput ...

  7. Winform 子窗体设置刷新父窗体

    方法1:所有权法 父窗体:Form1    子窗体:Form2 //Form1:窗体代码 //需要有一个公共的刷新方法 public void Refresh_Method() { //... } / ...

  8. Node js MySQL简单操作

    //win7环境下node要先安装MySQL的相关组件(非安装MySQL数据库),在cmd命令行进入node项目目录后执行以下语句 //npm install mysql var mysql = re ...

  9. 【Linux】- Ubutnu UFW防火墙的简单设置

    ufw是一个主机端的iptables类防火墙配置工具,比较容易上手.一般桌面应用使用ufw已经可以满足要求了. 安装方法 sudo apt-get install ufw 使用方法 1.启用: sud ...

  10. linux+Nginx+Mysql+PHP环境下,安装mysqli模块

    奶奶的腿儿啊,太不易了.倒腾了小半天儿,写此随笔,待后查. 阿里云ecs中,安装phpcms,出现了一个问题:环境检测的时候,一直提示 Mysqli扩展没开启. 老夫哪儿特么会这么专业的啊...能咋办 ...