Educational Codeforces Round 58 (Rated for Div. 2) D 树形dp + 数学
https://codeforces.com/contest/1101/problem/D
题意
一颗n个点的树,找出一条gcd>1的最长链,输出长度
题解
- 容易想到从自底向长转移
- 因为只需要gcd>1即可,所以定义\(dp[u][i]\)为u的子树中和u相连的gcd含有i的最长链长度,i为素因子
- 这样对于每个点u,维护\(dp[u][i]\),用两条最长子链和u构成的链更新答案即可
代码
#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
map<int,int>dp[MAXN];
int n,a[MAXN],u,v,ans,vi[MAXN];
vector<int>fac[MAXN],G[MAXN];
void init(){
for(int i=2;i<MAXN;i++)
if(!vi[i])
for(int j=i;j<MAXN;j+=i)
vi[j]=1,fac[j].push_back(i);
}
void dfs(int u,int fa){
map<int,int>mx,mx2;
for(auto v:G[u]){
if(v==fa)continue;
dfs(v,u);
int g=__gcd(a[u],a[v]);
for(auto x:fac[g]){
dp[u][x]=max(dp[v][x],dp[u][x]);
if(dp[v][x]>mx[x])mx2[x]=mx[x],mx[x]=dp[v][x];
else if(dp[v][x]>mx2[x])mx2[x]=dp[v][x];
ans=max(ans,mx[x]+mx2[x]+1);
}
}
for(auto x:fac[a[u]]){
dp[u][x]++;
ans=max(dp[u][x],ans);
}
}
int main(){
init();
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=0;i<n-1;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,0);
cout<<ans;
}
Educational Codeforces Round 58 (Rated for Div. 2) D 树形dp + 数学的更多相关文章
- Educational Codeforces Round 58 (Rated for Div. 2) 题解
Educational Codeforces Round 58 (Rated for Div. 2) 题目总链接:https://codeforces.com/contest/1101 A. Min ...
- Educational Codeforces Round 58 (Rated for Div. 2) F dp + 优化(新坑) + 离线处理
https://codeforces.com/contest/1101/problem/F 题意 有n个城市,m辆卡车,每辆卡车有起点\(s_i\),终点\(f_i\),每公里油耗\(c_i\),可加 ...
- Educational Codeforces Round 58 (Rated for Div. 2) G 线性基
https://codeforces.com/contest/1101/problem/G 题意 一个有n个数字的数组a[],将区间分成尽可能多段,使得段之间的相互组合异或和不等于零 题解 根据线性基 ...
- Educational Codeforces Round 58 (Rated for Div. 2)
A. Minimum Integer 水 #include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using name ...
- Educational Codeforces Round 58 (Rated for Div. 2) (前两题题解)
感慨 这次比较昏迷最近算法有点飘,都在玩pygame...做出第一题让人hack了,第二题还昏迷想错了 A Minimum Integer(数学) 水题,上来就能做出来但是让人hack成了tle,所以 ...
- Educational Codeforces Round 59 (Rated for Div. 2) E 区间dp + 状态定义 + dp预处理(分步dp)
https://codeforces.com/contest/1107/problem/E 题意 给出01字符串s(n<=100),相邻且相同的字符可以同时消去,一次性消去i个字符的分数是\(a ...
- Educational Codeforces Round 89 (Rated for Div. 2) B. Shuffle(数学/双指针)
题目链接:https://codeforces.com/contest/1366/problem/B 题意 大小为 $n$ 的数组 $a$,除了 $a_x = 1$,其余 $a_i = 0$,依次给出 ...
- Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
#include<bits/stdc++.h>using namespace std;const long long mod=998244353;long long f[200007][2 ...
- Educational Codeforces Round 82 (Rated for Div. 2)E(DP,序列自动机)
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ],t[]; int n,m; ][]; ...
随机推荐
- nginx日志 logrotate配置
nginx 日志 logrotate配置如下: /var/log/nginx/*.log { daily missingok rotate 20 compress delaycompress noti ...
- 爬虫之进阶 基于twisted实现自制简易scrapy框架(便于对scrapy源码的理解)
1.调度器 class Scheduler(object): """调度器""" def __init__(self, engine): & ...
- 给统计人讲python(1)模拟城市_数据分析
为让学校统计学社的同学了解python在数据处理方面的功能,将手游模拟城市的工厂生产进行建模,让同学在建模与处理非结构数据的过程中学习和了解python.将准备的内容放在此让更多需要的人特别是统计人( ...
- 100-days: twenty-one
Title: Not so fantastic(<口>极好的,棒的): can Japan end its love affair(喜爱,热爱) with plastic(塑料)? A : ...
- button的后台点击事件
在html元素加上runat,type就可以使用onserverclick创建后台事件<button runat='server' onserverclick='Btn_Click' type= ...
- vue.js 进行初始化遇到的关于core-js的错误@core-js/modules/es6.array.find-index]
D:\vuejselement\workSpace\zutnlp_platform_show>cnpm install --save core-js/modules/es6.array.find ...
- HashTable和HashMap的区别详解(转)
一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的, ...
- java 坑总结
1.Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available. 解 ...
- 推荐几个可以从google play(谷歌应用商店)直接下载原版APP的网站
http://apk-dl.com/ https://apkpure.com/ http://apk-downloaders.com
- CAS SSO单点登录实例
1.因为是本地模拟sso环境,而sso的环境测试需要域名,所以需要虚拟几个域名出来,步骤如下: 2.进入目录C:\Windows\System32\drivers\etc 3.修改hosts文件 12 ...