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 ( ...
随机推荐
- 关于ES6 用箭头函数后的 this 指向问题
最近写完小程序后, 开始学习React, 因为有编译器, 就直接用ES6 新语法了, 中间自然离不开 () => { console.log('箭头函数的this是指向哪的问题')}; var ...
- CentOS 7 安装Maven
Maven的下载地址是:http://maven.apache.org/download.cgi 安装Maven非常简单,只需要将下载的压缩文件解压就可以了. cd /data wget http:/ ...
- android应用中去android市场去评分的功能实现(吐槽一波个人应用上线...)
一般的app可能会有这中功能,在应用中去android商店评分来提高排名,前段时间也把我的博客园上传到商店,这里不得不吐槽一些android商店的开放平台. 酷派,vivo,oppo,联想不支持个人开 ...
- Linux-PATH_环境变量
PATH变量 是linux系统里的一个环境变量,系统已经定义好了,我们不需要再定义. 作用: 是linux里使用的命令都存在在PATH变量后面指定的目录下,我们使用命令 ...
- Linux下 开启防火墙端口
命令行输入: vi /etc/sysconfig/iptables 将 -A INPUT -m state --state NEW -m tcp -p tcp --dport 端口号 -j ACCEP ...
- Java Integer类型比较
今天做了一道题目题目如下: Integer a=10; Integer b=10; System.out.print(a==b); Integer c=200; Integer d=200; Syst ...
- java定时器schedule和scheduleAtFixedRate区别
package cn.lonecloud.test; import java.util.Date; import java.util.Timer; import java.util.TimerTask ...
- mysql存储引擎、事务
MySQL存储引擎介绍 文件系统 操作系统组织和存取数据的一种机制. 文件系统是一种软件. 文件系统类型 ext2 ext3 ext4 xfs 数据 不管使用什么文件系统,数据内容不会变化 不同 ...
- 初学Python(第一课)
今天整理一下关于Python初学者的基础知识部分的第一课,因为之前学习过C,所以过于基础的知识就不详细记录了. Python相对于C\C++来说,在语法方面已经很简单了:甚至对于JavaScript也 ...
- C语言_了解一下C语言中的四种存储类别
C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. C语言中的四种存储类别:auto ...