【cf842C】 Ilya And The Tree(dfs、枚举因子)
题意
给一棵树求每个点到根的路上允许修改一个为0,gcd的最大值。
题解
g是从根到当前点允许修改的最大gcd,gs为不修改的最大gcd。枚举当前点的因子,更新路径上每个因子出现次数,回溯时减去。并用这个因子更新答案。另外当前点修改为0时,还要用父节点的gs更新答案。复杂度\(O(n\sqrt n)\)
代码
const int N=201000;
int n;
int a[N];
int u,v;
VI e[N];
int g[N],gs[N];
int p[N];
void dfs(int x,int fa,int dep){
	for(int i=1;(ll)i*i<=a[x];++i)if(a[x]%i==0){
		++p[i];if(i*i!=a[x])++p[a[x]/i];
		if(p[i]>=dep-1) g[x]=max(g[x],i);
		if(p[a[x]/i]>=dep-1) g[x]=max(g[x],a[x]/i);
	}
	g[x]=max(gs[fa],g[x]);
	gs[x]=__gcd(a[x],gs[fa]);
	for(auto &v:e[x])if(v!=fa)
		dfs(v,x,dep+1);
	for(int i=1;(ll)i*i<=a[x];++i)if(a[x]%i==0){
		--p[i];if(i*i!=a[x])--p[a[x]/i];
	}
}
int main() {
	while(~scanf("%d",&n)){
		mem(g,0);mem(gs,0);
		rep(i,1,n+1)scanf("%d",a+i),e[i].clear();
		rep(i,0,n-1)scanf("%d%d",&u,&v),e[u].pb(v),e[v].pb(u);
		g[0]=gs[0]=a[1];
		dfs(1,0,1);
		rep(i,1,n+1)printf("%d%c",g[i],i==n?'\n':' ');
	}
	return 0;
}
												
											【cf842C】 Ilya And The Tree(dfs、枚举因子)的更多相关文章
- HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)
		
想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权.但是怎么枚举这m个点,实在不会.网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用. 参考链接:http:/ ...
 - HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
		
Minimal Ratio Tree Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
 - CF842C Ilya And The Tree
		
思路: 1. 如果根节点是0,那么可以通过一次dfs计算出所有节点的最大值. 2. 如果根节点不是0,那么其余各点的最大值一定是根节点的一个因子.首先计算出根节点的所有因子.在dfs到一个深度为d的节 ...
 - hdu2489  Minimal Ratio Tree   dfs枚举组合情况+最小生成树
		
#include <stdio.h> #include <set> #include <string.h> #include <algorithm> u ...
 - C. Ilya And The Tree   树形dp 暴力
		
C. Ilya And The Tree 写法还是比较容易想到,但是这么暴力的写法不是那么的敢写. 就直接枚举了每一个点上面的点的所有的情况,对于这个点不放进去特判一下,然后排序去重提高效率. 注意d ...
 - POJ 2429 GCD & LCM Inverse (Pollard rho整数分解+dfs枚举)
		
题意:给出a和b的gcd和lcm,让你求a和b.按升序输出a和b.若有多组满足条件的a和b,那么输出a+b最小的.思路:lcm=a*b/gcd lcm/gcd=a/gcd*b/gcd 可知a/gc ...
 - Codeforces Round #430 (Div. 2) C. Ilya And The Tree
		
地址:http://codeforces.com/contest/842/problem/C 题目: C. Ilya And The Tree time limit per test 2 second ...
 - HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489 Problem Description For a tree, which nodes and ...
 - Codeforces 842C--Ilya And The Tree(dfs+树)
		
原题链接:http://codeforces.com/contest/842/problem/C 题意:一个以1为根节点的树,每个节点有一个值ai,定义美丽度:从根节点到这个节点的路径上所有ai的gc ...
 
随机推荐
- 关于oracle设置主键自增的问题
			
关于orcale设置主键自增的问题 关于主键Oracle中并没有提供一个直接的语句设置,对于这个oralce一般都是用序列和触发器来实现 一下又两种方法来实现 一 ,不使用触发器 创建序列: crea ...
 - kubectl常用命令汇总
			
#查看k8s的所有node节点 kubectl get node #查看ns的pod kubectl get pod --all-namespaces -o wide kubectl get pod ...
 - Zk搭建(Zookeeper)
			
第一步: 上传----解压 tar -zxvf zookeeper-3.4.5.tar.gz---- 配置zk的环境变量 ----------配置源码 vim ...
 - 如何入门vue之二
			
学习完指令之后我们需要学习的就是组件. 在学习组件前我们要了解一下 methods 用来处理事件的. computed用来计算属性 他就是类似于data一样只不过是动态的处理数据 里面写的方法当成属 ...
 - Cookie-parser
			
let express = require('express'); let app =new express(); // 引入cookie-parser; let cookieParser = req ...
 - CentOS7配置gradle,或配置maven
			
借鉴博客: https://www.cnblogs.com/imyalost/p/8746527.html 特简单,不多说了,自己看 1.下载gradle4.6版本:wget https://down ...
 - Artifact project04:war :Error during artifact deployment. See server log for details
			
困扰了我好长时间,我的错误是 先 Run clean 再package就成功了.
 - Android——线程通讯 Handler、Looper、Message;
			
线程通讯问题 (主要用到了Handler类,Looper类和Message类以及MessageQueue) 在Android中主线程如何向子线程中发送消息的问题.让我们来想想,这其中的过程,无非就是创 ...
 - python学习笔记(10)--组合数据类型(集合类型)
			
集合类型 集合是多个元素的无序组合,每个元素唯一,不存在相同类型,每个元素是不可变类型.用{}表示,元素间用逗号分隔.建立结合类型用{},或set函数,如果是空集合必须用set. >>&g ...
 - java 静态成员访问
			
public class MqConfig { @Getter private static IProducerProcessor callBackProducerRetry; @Getter @Va ...