题目描述

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

输入格式

第一行一个整数 n,表示点的个数。

接下来 n−1 行,每行两个整数 x,y 表示 x,y 之间有边。

数据保证给出的是一棵树。

接下来一行 n 个整数表示每个点对应的权值 ai​。

输出格式

输出一个整数,表示这条树链的长度。

样例

样例输入

4

1 2

1 3

2 4

6 4 5 2

样例输出

3

数据范围与提示

n<=10^5,1<= ai<=10^9。

【题解】

做这类题一定要记住这句话:

没有暴力解决不了的题,只有不敢写暴力的人!

咳咳,所以说,这题的正解正是暴力。

读完题后,我们不难想到这样一个暴力:枚举每一个质数,权值是这个质数的倍数的节点设为1,最长链的长度就是点权为1的点构成的最长的链。

如果枚举所有质数,这题就会变成n*n,一定是A不了的,那怎么办呢?方法是这样的。

每个数最多只有log个不同的质因数,所以只要把所有点权质因数分解,枚举出现的质数就可以了。

我们枚举完质因数后dfs,因为每个点最多有log个不同的质因数,所以复杂度大概是O(能过)O(nlogn)。

【题外话】

这么写有一些小问题,如果质数极大就会T,Loj是能A的(数据真垃圾),但吕神的数据比较优秀,把我卡成了75.

这题告诉我:永远不要被数据吓到,也永远不要放弃一题,万一打个暴力能A呢?

下贴本蒟蒻丑陋的代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N=;
int n,con,ans=,h[N],cnt,a[N],p[N],dis[N];
bool v[N];
struct
{
int nex,to;
}e[N<<]; void dfs(int u,int b,int c)
{
dis[u]=;
for(int i=h[u];i;i=e[i].nex)
if(e[i].to!=b && a[e[i].to]%c==)
{
while(a[e[i].to]%c==)
a[e[i].to]/=c;
dfs(e[i].to,u,c);
ans=max(ans,dis[u]+dis[e[i].to]+);
dis[u]=max(dis[u],dis[e[i].to]);
}
dis[u]++;
} void add(int u,int v)
{
cnt++;
e[cnt].nex=h[u];
e[cnt].to=v;
h[u]=cnt;
} int main()
{ scanf("%d",&n);
for(int i=;i*i<=;i++)
if(v[i]==)
{
for(int j=i*i;j<;j+=i) v[j]=;
}
for(int i=;i<=;i++)
if(v[i]==)
p[++con]=i;
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
{
int s=a[i];
for(int j=;j<=con && p[j]*p[j]<=a[i];j++)
{
if(s%p[j]==)
{
while(s%p[j]==)
s/=p[j];
dfs(i,,p[j]);
}
}
if(s>)
dfs(i,,s);
a[i]=;
}
printf("%d",ans);
return ;
}

oi路漫漫,愿此题解能助你一臂之力......

「美团 CodeM 初赛 Round A」最长树链的更多相关文章

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

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

  2. #6164. 「美团 CodeM 初赛 Round A」数列互质-莫队

    #6164. 「美团 CodeM 初赛 Round A」数列互质 思路 : 对这个题来言,莫队可以 n*根号n 离线处理出各个数出现个的次数 ,同时可以得到每个次数出现的次数 , 但是还要处理有多少 ...

  3. loj #6177. 「美团 CodeM 初赛 Round B」送外卖2 状压dp floyd

    LINK:#6177.美团 送外卖2 一道比较传统的状压dp题目. 完成任务 需要知道自己在哪 已经完成的任务集合 自己已经接到的任务集合. 考虑这个dp记录什么 由于存在时间的限制 考虑记录最短时间 ...

  4. 【loj6177】「美团 CodeM 初赛 Round B」送外卖2 Floyd+状压dp

    题目描述 一张$n$个点$m$条边的有向图,通过每条边需要消耗时间,初始为$0$时刻,可以在某个点停留.有$q$个任务,每个任务要求在$l_i$或以后时刻到$s_i$接受任务,并在$r_i$或以前时刻 ...

  5. Loj #6164. 「美团 CodeM 初赛 Round A」数列互质

    link : https://loj.ac/problem/6164 莫队傻题,直接容斥做. #include<bits/stdc++.h> #define maxn 100005 #de ...

  6. LiberOJ#6178. 「美团 CodeM 初赛 Round B」景区路线规划 概率DP

    题意 游乐园被描述成一张 n 个点,m 条边的无向图(无重边,无自环).每个点代表一个娱乐项目,第 i 个娱乐项目需要耗费 ci 分钟的时间,会让小 y 和妹子的开心度分别增加 h1i ,h2i ,他 ...

  7. 「美团 CodeM 初赛 Round A」试题泛做

    最长树链 树形DP.我们发现gcd是多少其实并不重要,只要不是1就好了,此外只要有一个公共的质数就好了.计f[i][j]表示i子树内含有j因子的最长链是多少.因为一个数的不同的质因子个数是log级别的 ...

  8. loj6177 「美团 CodeM 初赛 Round B」送外卖2 最短路+状压dp

    题目传送门 https://loj.ac/problem/6177 题解 一直不知道允不允许这样的情况:取了第一的任务的货物后前往配送的时候,顺路取了第二个货物. 然后发现如果不可以这样的话,那么原题 ...

  9. [美团 CodeM 初赛 Round A]数列互质

    题目大意: 给出一个长度为n的数列a1,a2,a3,...,an,以及m组询问(li,ri,ki),求区间[li,ri]中有多少数在该区间中的出现次数与ki互质. 思路: 莫队. f[i]记录数字i出 ...

随机推荐

  1. BZOJ2141:排队

    浅谈分块:https://www.cnblogs.com/AKMer/p/10369816.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...

  2. dockerfile http_php

    FROM centos6.6-php5.5:0.0.1 MAINTAINER syberos:wangmo RUN mv /etc/php.ini /etc/php.ini.bak COPY ./ph ...

  3. 得到properties配置文件内容

    代码: 1.配置文件内容 2.文件所在项目中位置: 3.java代码: 01.得到键值对: @Test public void getProp() { Properties prop = new Pr ...

  4. java代码分解质因数

    总结: 循环...首位 逻辑要清晰 很简单.首先质因数最小的2.因为1不是质数 然后当输入的数刚好为2时,结束.不用下一步了.否则在循环里不停的输出一个数, 当输入的数比2大时,分能被2整除和不能被2 ...

  5. nignx 重启

    sudo /opt/nginx/sbin/nginx -s stop sudo /opt/nginx/sbin/nginx

  6. web基础 (三) CSS

    css 层叠样式表 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. selector { property: value; property: value; ... property: ...

  7. [机器学习基础]矩阵基础和numpy

    矩阵定义:[摘自百度百科] 由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵.记作: 这m×n 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称 ...

  8. CentOS 7.2 部署Rsync + Lsyncd服务实现文件实时同步/备份 (一)

    接收端配置: 1.安装rsync yum -y install rsync 2.配置同步模块 1. 编辑同步配置文件 vi /etc/rsyncd.conf 2. 同步模块配置参数 # any nam ...

  9. ConfigureAwait(false)

    昨天在做项目的时候,用的dapper查数据用的QueryAsync 异步方法.给上级做代码审核时,上级说最好加上ConfigureAwait(false).能减少一些性能开销. 因为之前没用过所以看了 ...

  10. Xshell的简单使用

    1.下载并安装 Xshell 4打开后如下图所示,会出现一个界面框,这个界面框类似于DOS的界面,需要操控远程的主机,都是通过这个界面进行操作. 2在这个界面左上角的位置有一个文件按钮,点击这个按钮. ...