按照题解的做法,对于每一个质约数分别进行讨论最长链就行
对于每一个数的质约数可是比logn还要小的

比赛的时候没人写,我也没看 = =,可惜了,不过我当时对于复杂度的把握也不大啊

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <queue>
#include <cmath>
using namespace std;
typedef long long ll;
#define MP(x, y) make_pair(x, y)
#define lson l,m, rt<<1
#define rson m+1, r, rt<<1|1
const int N = 1e5+5;
const int INF = 0x3f3f3f3f; struct Node{
int to, nx;
}E[N*2];
int head[N], tot;
void add(int fr, int to) {
E[tot].to = to; E[tot].nx = head[fr]; head[fr] = tot ++;
}
int vis[N]; int nw; int divisor; int val[N];
int Prime[N];
int Isprime[N]; int cnt;
int dis[N];
int ans; map<int, vector<int> > mp;
map<int, vector<int> > ::iterator it; void dfs(int x) {
dis[x] = 1;
int maxx = 0, Maxx = 0;
for(int i = head[x]; ~i; i = E[i].nx) {
int y = E[i].to;
if(vis[y] == nw || val[y] % divisor) continue;
vis[y] = nw;
dfs(y);
if(dis[y] > Maxx) maxx = Maxx, Maxx = dis[y];
else if(dis[y] > maxx) maxx = dis[y];
}
ans = max(maxx + Maxx + 1, ans);
dis[x] = Maxx + 1;
}
void solve(int x) {
divisor = x; // printf("%d: ",x); for(int i = 0; i < mp[x].size(); ++i) printf("%d ", mp[x][i]); printf("\n");
++nw;
for(int i = 0; i < mp[x].size(); ++i) {
int y = mp[x][i];
if(vis[y] != nw) {
vis[y] = nw;
dfs(y);
// printf("hh\n");
}
}
}
int main() {
int n;
cnt = 0;
for(int i = 2; i < N; ++i) {
if(!Prime[i]) {
Isprime[++cnt] = i;
for(int j = 2*i; j < N; j += i) {
Prime[j] ++;
}
}
}
// for(int i = 1; i <= 10; ++i) printf("%d ", Isprime[i]); printf("\n");
while(~scanf("%d", &n)) {
mp.clear();
nw = 0; memset(vis, 0, sizeof(vis));
memset(head, -1, sizeof(head)); tot = 0; for(int i = 1; i < n; ++i) {
int a, b; scanf("%d %d", &a, &b);
add(a, b); add(b, a);
}
for(int i = 1; i <= n; ++i) {
scanf("%d", &val[i]);
int tt = val[i];
// printf("%d ", val[i]);
for(int j = 1; 1ll*Isprime[j] * Isprime[j] <= tt; ++j) {
if(tt % Isprime[j] == 0) {
mp[Isprime[j]].push_back(i);
while(tt % Isprime[j] == 0) {
tt /= Isprime[j];
}
}
}
if(tt != 1) {
mp[tt].push_back(i);
}
}
// printf("hh\n"); ans = -1;
for(it = mp.begin(); it != mp.end(); ++it) {
solve(it->first);
} printf("%d\n", ans);
}
return 0;
}

CodeM资格赛 Round A 最长树链的更多相关文章

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

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

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

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

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

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

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

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

  5. [LOJ 6159] 最长树链

    看到要求gcd不为1所以肯定在这条答案链上都是一个质数的倍数,所以就会产生一个很暴力的想法 没错,正解就是这样的暴力 只让走是i(素数)倍数的点,作最长链 最长链可以树形dp或两遍bfs,一遍找端点, ...

  6. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

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

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

  8. 从lca到树链剖分 bestcoder round#45 1003

    bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或) ...

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

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

随机推荐

  1. lxml etree的一个问题

    <div> <a href="xxxx">123</a> <a href="xxxx">45</a> ...

  2. Composer 结合 Git 创建 “服务类库”

    Composer 结合 Git 创建 "服务类库" 我一直认为,现在的 PHP 已经进展到了工程化的领域.以前的 PHP 开发者,以快为美,速度和规模永远都是矛盾体.现在的 PHP ...

  3. Promise对象的简单用法

    要了解一个东西,首先要从,它是什么.用来做什么以及怎么取用它这三个方面来了解. 首先,promise是什么? 我们来参考一下MDN对它的定义: Promise 对象用于一个异步操作的最终完成(或失败) ...

  4. 让我们一起摇摆 Turnipbit体感遥控车

    相信大家对Microbit是非常熟悉的,而今天我们做的这个小玩具所用的核心板是Turnipbit,是基于 Microbit开发的一块适合儿童适用的板卡.基本使用原理是一样的,这里就不多介绍了,代码这方 ...

  5. js 前端图片压缩+ios图片角度旋转

    step1:读取选择的图片,并转为base64: function ImgToBase64 (e, fn) { // 图片方向角 //fn为传入的方法函数,在图片操作完成之后执行 var Orient ...

  6. 根据展示文字自适应 cell 高度,实现点击cell的伸缩扩展

    1.要根据展示的文字计算cell的高度, 再此给NSString写的延展的方法, 以此获取展示文字的高度 2.在自定义的cell中 声明属性和定义方法 注:在cell上初始化子控件,最好用代码写, 不 ...

  7. Java面试题库及答案解析

    1.面向对象编程(OOP)有哪些优点? 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码的可理解性. 2.面向对象编程有哪些特性? 封装.继承.多态.抽象 封装 封装 ...

  8. 在windows端和linux端安装Git

    一.Git的安装 1. 在windows端 到地址:https://git-scm.com/downloads 选择对应版本下载后,进行傻瓜式安装即可 2.  在linux端 查看是否安装了git,出 ...

  9. 三、scrapy后续

    CrawlSpiders 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent tencent.com 我们通过正则表达 ...

  10. 深度学习中batch normalization

    目录 1  Batch Normalization笔记 1.1  引包 1.2  构建模型: 1.3  构建训练函数 1.4  结论 Batch Normalization笔记 我们将会用MNIST数 ...