[LOJ 6159] 最长树链
看到要求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] 最长树链的更多相关文章
- 「美团 CodeM 初赛 Round A」最长树链
题目描述 Mr. Walker 最近在研究树,尤其是最长树链问题.现在树中的每个点都有一个值,他想在树中找出最长的链,使得这条链上对应点的值的最大公约数不等于1.请求出这条最长的树链的长度. 输入格式 ...
- newcoder-最长树链-树/gcd
https://ac.nowcoder.com/acm/problem/13233 链接:https://ac.nowcoder.com/acm/problem/13233来源:牛客网 题目描述 树链 ...
- [美团 CodeM 初赛 Round A]最长树链
题目大意: 给你一棵带点权的树,找出一个最长的树链满足链上点权的最大公因数不为1. 思路: 暴力DP. 对于每个点,记录一下以这个点为一个端点的所有链的最大公因数及长度. 然后暴力转移一下,时间复杂度 ...
- CodeM资格赛 Round A 最长树链
按照题解的做法,对于每一个质约数分别进行讨论最长链就行 对于每一个数的质约数可是比logn还要小的 比赛的时候没人写,我也没看 = =,可惜了,不过我当时对于复杂度的把握也不大啊 #include & ...
- 【填坑】loj6159. 「美团 CodeM 初赛 Round A」最长树链
水一水 枚举各个质数,把是这个数倍数的点留下,跑直径,没了 #include <bits/stdc++.h> using namespace std; int h,t,n,p,q,M,N; ...
- 树链剖分-点的分治(点数为k且距离最长的点对)
hdu4871 Shortest-path tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 130712/130712 K ( ...
- LOJ#139. 树链剖分
LOJ#139. 树链剖分 题目描述 这是一道模板题. 给定一棵$n$个节点的树,初始时该树的根为 1 号节点,每个节点有一个给定的权值.下面依次进行 m 个操作,操作分为如下五种类型: 换根:将一个 ...
- 树链剖分 (求LCA,第K祖先,轻重链剖分、长链剖分)
2020/4/30 15:55 树链剖分是一种十分实用的树的方法,用来处理LCA等祖先问题,以及对一棵树上的节点进行批量修改.权值和查询等有奇效. So, what is 树链剖分? 可以简单 ...
- 【loj#139】树链剖分
#139. 树链剖分 题目描述 这是一道模板题. 给定一棵 $n$个节点的树,初始时该树的根为 111 号节点,每个节点有一个给定的权值.下面依次进行 $m$ 个操作,操作分为如下五种类型: 换根:将 ...
随机推荐
- 跟浩哥学自动化测试Selenium -- 浏览器的基本操作与元素定位(3)
浏览器的基本操作与元素定位 通过上一章学习,我们已经学会了如何设置驱动路径,如何创建浏览器对象,如何打开一个网站,接下来我们要进行一些复杂的操作比如先打开百度首页,在打开博客园,网页后退,前进等等,甚 ...
- Git命令使用大全
一前言 最近公司在使用vue和WebAPI前后端分离的项目开发,使用的代码管理工具是git,刚开始使用的时候前端的vue文件还比较好处理,但是后端的C#文件在每一次自己编译之后上传都会和其他小伙伴的代 ...
- hexo部署失败如何解决
- [Clr via C#读书笔记]Cp6类型和成员基础
Cp6类型和成员基础 成员 常量:字段(静态字段和实例字段):实例构造器:类型构造器(用于静态字段的构造):方法(静态方法和实例方法):操作符重载(本质是一个方法):转换操作符:属性(本质还是方法): ...
- Paper Reading - Convolutional Image Captioning ( CVPR 2018 )
Link of the Paper: https://arxiv.org/abs/1711.09151 Motivation: LSTM units are complex and inherentl ...
- HDU 3467 Song of the Siren(圆交)
Problem Description In the unimaginable popular DotA game, a hero Naga Siren, also known as Slithice ...
- C语言中动态内存的分配(malloc,realloc)
动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针 ...
- 软工1816 · Alpha冲刺(1/10)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 前后端代码规范统一 针对之前的alpha冲刺安排进一步细化任务卡片 明确apl ...
- 网众远程修改ip、dns
修改文件 修改ip vi /etc/rc.d/rc.inetd1.config IPADDR[0] 对应第一块网卡的ip 修改dns vi /etc/resolv.conf nameserver 21 ...
- C# 开发者最经常犯的 8 个错误
在和C#新手一起工作的时候,我注意到他们经常重复一些错误.这些错误,当你指出来的时候很容易理解.然而,如果一个开发者没有意识到这些错误,将会影响正在开发的软件的质量和效率,因此,我决定总结8个常见的错 ...