CF842C Ilya And The Tree
思路:
1. 如果根节点是0,那么可以通过一次dfs计算出所有节点的最大值。
2. 如果根节点不是0,那么其余各点的最大值一定是根节点的一个因子。首先计算出根节点的所有因子。在dfs到一个深度为d的节点v时,遍历所有因子:对于因子x,p表示从根节点到达v的路径中能够被x整除的节点个数。如果p >= d - 1,则x就是当前节点的一个候选最大值(d-1是因为可以把路径中其中一个数替换为0)。
于是通过两次dfs即可得出答案。复杂度O(n * sqrt(n))。在dfs的过程中,要注意维护全局变量。dfs到下一个分支时,要把上一个分支对全局变量造成的影响消除。
实现:
#include <bits/stdc++.h>
using namespace std;
int a[], val[];
vector<int> tree[];
int vis[];
int divisors[]; void dfs(int cur, int div)
{
vis[cur] = ;
for (int i = ; i < tree[cur].size(); i++)
{
int tmp = tree[cur][i];
if (vis[tmp]) continue;
val[tmp] = __gcd(div, a[tmp]);
dfs(tmp, val[tmp]);
}
} void dfs2(int cur, int d, vector<int>& v)
{
vis[cur] = ;
for (int i = ; i < tree[cur].size(); i++)
{
int tmp = tree[cur][i];
if (vis[tmp]) continue;
for (int j = ; j < v.size(); j++)
{
if (a[tmp] % v[j] == ) divisors[j]++;
if (divisors[j] >= d) val[tmp] = max(val[tmp], v[j]);
}
dfs2(tmp, d + , v);
for (int j = ; j < v.size(); j++)
if (a[tmp] % v[j] == ) divisors[j]--;
}
} int main()
{
int n, x, y;
while (cin >> n)
{
for (int i = ; i <= n; i++)
tree[i].clear();
for (int i = ; i <= n; i++)
cin >> a[i];
for (int i = ; i < n - ; i++)
{
cin >> x >> y;
tree[x].push_back(y);
tree[y].push_back(x);
}
int tmp = a[];
a[] = ;
memset(vis, , sizeof vis);
dfs(, );
a[] = val[] = tmp;
vector<int> v;
for (int i = ; i * i <= a[]; i++)
{
if (a[] % i == )
{
v.push_back(i);
if (a[] / i != i) v.push_back(a[] / i);
}
}
sort(v.begin(), v.end());
for (int i = ; i < v.size(); i++) divisors[i] = ;
memset(vis, , sizeof vis);
dfs2(, , v);
for (int i = ; i <= n; i++)
cout << val[i] << " ";
cout << endl;
}
return ;
}
CF842C Ilya And The Tree的更多相关文章
- 【cf842C】 Ilya And The Tree(dfs、枚举因子)
C. Ilya And The Tree 题意 给一棵树求每个点到根的路上允许修改一个为0,gcd的最大值. 题解 g是从根到当前点允许修改的最大gcd,gs为不修改的最大gcd.枚举当前点的因子,更 ...
- 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 ...
- C. Ilya And The Tree 树形dp 暴力
C. Ilya And The Tree 写法还是比较容易想到,但是这么暴力的写法不是那么的敢写. 就直接枚举了每一个点上面的点的所有的情况,对于这个点不放进去特判一下,然后排序去重提高效率. 注意d ...
- codeforces 842C Ilya And The Tree
Ilya is very fond of graphs, especially trees. During his last trip to the forest Ilya found a very ...
- Codeforces Round #430 C. Ilya And The Tree
Ilya is very fond of graphs, especially trees. During his last trip to the forest Ilya found a very ...
- C - Ilya And The Tree Codeforces Round #430 (Div. 2)
http://codeforces.com/contest/842/problem/C 树 dp 一个数的质因数有限,用set存储,去重 #include <cstdio> #includ ...
- Codeforces 842C Ilya And The Tree 树上gcd
题目链接 题意 给定一棵根为\(1\)的树.定义每个点的美丽值为根节点到它的路径上所有点的\(gcd\)值.但是对于每个点,在计算它的美丽值时,可以将这条路径上某个点的值变为\(0\)来最大化它的美丽 ...
- Ilya And The Tree CodeForces - 842C
((半个)智商题,主要难度在于实现) 题意:有一棵n个结点组成的树,其根是编号为1的结点.对于每一个结点,生成从根结点走到这个结点的路径(包括自身),选择路径上的一个点或者不选择任何点,使得其它点的最 ...
- codeforces 842C Ilya And The Tree (01背包+dfs)
(点击此处查看原题) 题目分析 题意:在一个树中,有n个结点,记为 1~n ,其中根结点编号为1,每个结点都有一个值val[i],问从根结点到各个结点的路径中所有结点的值的gcd(最大公约数)最大是多 ...
随机推荐
- ETL全量多表同步简述
ETL全量多表同步简述 1. 实现需求 当原数据库的表有新增.更新.删除操作时,将改动数据同步到目标库对应的数据表. 2. 设计思路 设计总体流程图如下: 1.获取同步表名如下图: 2.循环迁移数据如 ...
- OCP知识点讲解 之 队列、资源与锁:RHCA|OCM|CCIE RedHat大中华地区前50位RHCA系统架构师:叶绍琛
一.队列与共享资源 共享资源可以被多个会话.进程同时访问,因此它的访问需要保护.Oracle中,除了PGA,所有的东西(包括内存.磁盘.CPU.表.索引.事务等等,种类太多,一概用东西两字来代表) ...
- zabbix学习系列之QQ消息报警
安装依赖包 环境 Zabbix: 3.2 OS:Centos 安装依赖包 yum install lrzsz chrony gcc gcc-c++ git openssl-devel perl-Ext ...
- 经常使用的android设计模式
一般来说,经常使用的android设计模式有下面8种:单例.工厂.观察者.代理.命令.适配器.合成.訪问者. 单例模式:目的是为了让系统中仅仅有一个调用对象,缺点是单例使其它程序过分依赖它,并且不 ...
- 面试题之strcpy/strlen/strcat/strcmp的实现
阿里的电面要我用C/C++实现一个字符串拷贝的函数,虽然以前写过 strcpy 的函数实现,但时间过去很久了,再加上有点紧张,突然就措手不及了.最后写是写出来了,但没考虑异常的情况,面试官好像很不满意 ...
- Cocos2D实现上下滚动式状态窗体
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 有时候要显示的内容太多,我们无法在iOS设备的小屏幕上显示出来 ...
- 2.eclipse 插件安装烦死人(2)
安装插件的实际结果是:(烦死人),要不是很多插件找不到,要不就是版本不对,要不就是下载了装上没有效果,要不就是在线安装(速度爆慢),好不容易等到结果了,结果是些错…… 最后我的eclipse 3.5. ...
- jvm实例的个数
Generally speaking, each application will get its own JVM instance and its own OS-level process and ...
- 恶意IP监控
http://www.icarei.cn/fastdatav/MyDebug/readlog/error/ip191.96.249.136
- beego2---入门
package main //beego既可以建立web应用也可以建立api应用 //beego是一个gohttp服务器的高层封装, import ( _ "beego1/routers&q ...