CodeM资格赛 Round A 最长树链
按照题解的做法,对于每一个质约数分别进行讨论最长链就行
对于每一个数的质约数可是比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 最长树链的更多相关文章
- [美团 CodeM 初赛 Round A]最长树链
题目大意: 给你一棵带点权的树,找出一个最长的树链满足链上点权的最大公因数不为1. 思路: 暴力DP. 对于每个点,记录一下以这个点为一个端点的所有链的最大公因数及长度. 然后暴力转移一下,时间复杂度 ...
- 「美团 CodeM 初赛 Round A」最长树链
题目描述 Mr. Walker 最近在研究树,尤其是最长树链问题.现在树中的每个点都有一个值,他想在树中找出最长的链,使得这条链上对应点的值的最大公约数不等于1.请求出这条最长的树链的长度. 输入格式 ...
- newcoder-最长树链-树/gcd
https://ac.nowcoder.com/acm/problem/13233 链接:https://ac.nowcoder.com/acm/problem/13233来源:牛客网 题目描述 树链 ...
- 【填坑】loj6159. 「美团 CodeM 初赛 Round A」最长树链
水一水 枚举各个质数,把是这个数倍数的点留下,跑直径,没了 #include <bits/stdc++.h> using namespace std; int h,t,n,p,q,M,N; ...
- [LOJ 6159] 最长树链
看到要求gcd不为1所以肯定在这条答案链上都是一个质数的倍数,所以就会产生一个很暴力的想法 没错,正解就是这样的暴力 只让走是i(素数)倍数的点,作最长链 最长链可以树形dp或两遍bfs,一遍找端点, ...
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- 「美团 CodeM 初赛 Round A」试题泛做
最长树链 树形DP.我们发现gcd是多少其实并不重要,只要不是1就好了,此外只要有一个公共的质数就好了.计f[i][j]表示i子树内含有j因子的最长链是多少.因为一个数的不同的质因子个数是log级别的 ...
- 从lca到树链剖分 bestcoder round#45 1003
bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或) ...
- 树链剖分-点的分治(点数为k且距离最长的点对)
hdu4871 Shortest-path tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 130712/130712 K ( ...
随机推荐
- <转>年终盘点!2017年超有价值的Golang文章
马上就要进入2018年了,作为年终的盘点,本文列出了一些2017年的关于Go编程的一些文章,并加上简短的介绍. 文章排名不分先后, 文章也不一定完全按照日期来排列.我按照文章的大致内容分了类,便于查找 ...
- django-rest-framework快速入门
前言:第一次接触django-rest-framework是在实习的时候.当时也不懂,看到视图用类方法写的感觉很牛逼的样子.因为官网是英文的,这对我的学习还是有一点的阻力的,所以当时也没怎么学.真是太 ...
- jenkins入门系列之一 jenkins的安装
Jenkins是一个CI(持续集成环境)工具.它可以根据设定持续定期编译,运行相应代码:运行UT或集成测试:将运行结果发送至邮件,或展示成报告... 这样做的最终目的是: 让项目保持健康的状态.如果任 ...
- 分享一下自己写的一个vscode-leetcode答题插件
0. 前言 春节这几天每天吃吃喝喝睡睡玩玩,突然发现明天就要上班了,吓得我虎躯一震. 春节结束之后,学生党们陆续开学,相信有许多同学马上就要在春季招聘中拼杀一番.想要收获心意的offer,当然免不了对 ...
- Python数据结构之三——dict(字典)
Python版本:3.6.2 操作系统:Windows 作者:SmallWZQ 知识源于生活.Python也是如此. 提到字典,我首先想到的是数学大师--高斯. 为何想起他呢?这主要是因为高斯算法 ...
- MysqL应该考虑到的安全策略
1:使用预处理语句防止SQL注入2:写入数据库的数据要进行特殊字符的转义,比如字符中带单引号和双引号需要在应用层转义,这样为了防止SQL注入3:查询的错误信息不要返回给用户,将错误记录到日志.错误信息 ...
- C语言_指针变量的赋值与运算,很详细
指针变量的赋值 指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值.未经赋值的指针变量不能使用, 否则将造成系统混乱,甚至死机.指针变量的赋值只能赋予地址, 决不能赋予任何其它数据 ...
- HDU - 1847 巴什博弈
思路: 0 1 2 3 4 5 6 7 8 9 10 11 12 P N N P N N P N N P N N P 不难发现:当n为三的倍数时,KIKI ...
- Codeforces103D - Time to Raid Cowavans
Portal Description 给出长度为\(n(n\leq3\times10^5)\)的序列\(\{a_n\}\),进行\(q(q\leq3\times10^5)\)次询问:给出\(x,y\) ...
- scrapy安装的问题
Found existing installation: six 1.4.1 DEPRECATION: Uninstalling a distutils installed project (six) ...